emitLog method
Performs the actual delivery of event to the transport's destination.
Called only when event.level >= this.level. Implementations must not
throw; swallow or handle errors internally.
Implementation
@override
Future<void> emitLog(LogEvent event) async {
final buffer = StringBuffer();
// --- Header line ---
buffer.write('${_emojis[event.level]} ');
buffer.write('${_labels[event.level]} ');
if (showTimestamp) {
buffer.write('${_formatTime(event.timestamp)} ');
}
if (showContext && event.context != null) {
buffer.write('[${event.context}] ');
}
buffer.write(event.message.toString());
final headerLine = buffer.toString();
// --- Error line ---
String? errorLine;
if (event.error != null) {
errorLine = ' ↳ ${event.error}';
}
// --- Stack trace lines ---
List<String>? stackLines;
if (showStackTrace && event.stackTrace != null) {
stackLines = event.stackTrace
.toString()
.trimRight()
.split('\n')
.map((l) => ' ↳ $l')
.toList();
}
// --- Colorize ---
String output;
if (colorize) {
final color = _colors[event.level]!;
final bold = AnsiColor.bold;
final reset = AnsiColor.reset;
final parts = [
'$bold$color$headerLine$reset',
if (errorLine != null) '$color$errorLine$reset',
if (stackLines != null)
stackLines.map((l) => '$color$l$reset').join('\n'),
];
output = parts.join('\n');
} else {
final parts = [
headerLine,
?errorLine,
if (stackLines != null) stackLines.join('\n'),
];
output = parts.join('\n');
}
// ignore: avoid_print
print(output);
}