@@ -27,6 +27,56 @@ namespace {
27
27
return TLogRecord (Priority, Buf.Data (), Buf.Filled ());
28
28
}
29
29
};
30
+
31
+ struct TRecordWithColorsAndNewline {
32
+ ELogPriority Priority;
33
+ TTempBuf Buf;
34
+
35
+ TRecordWithColorsAndNewline (const TLogRecord& rec)
36
+ : Priority(rec.Priority)
37
+ , Buf(rec.Len + 16 )
38
+ {
39
+ switch (rec.Priority ) {
40
+ case ELogPriority::TLOG_EMERG:
41
+ Buf.Append (" \x1b [31m" , 5 ); // Red color for emergencies
42
+ break ;
43
+ case ELogPriority::TLOG_ALERT:
44
+ Buf.Append (" \x1b [31;1m" , 7 ); // Bright red
45
+ break ;
46
+ case ELogPriority::TLOG_CRIT:
47
+ Buf.Append (" \x1b [35m" , 5 ); // Magenta color for critical logs
48
+ break ;
49
+ case ELogPriority::TLOG_ERR:
50
+ Buf.Append (" \x1b [31;1m" , 7 ); // Bright red
51
+ break ;
52
+ case ELogPriority::TLOG_WARNING:
53
+ Buf.Append (" \x1b [33m" , 5 ); // Yellow color for warnings
54
+ break ;
55
+ case ELogPriority::TLOG_NOTICE:
56
+ Buf.Append (" \x1b [36m" , 5 ); // Cyan color for notices
57
+ break ;
58
+ case ELogPriority::TLOG_INFO:
59
+ Buf.Append (" \x1b [37m" , 5 ); // White color for info
60
+ break ;
61
+ case ELogPriority::TLOG_DEBUG:
62
+ Buf.Append (" \x1b [38;5;248m" , 11 ); // White-grey color for debug
63
+ break ;
64
+ case ELogPriority::TLOG_RESOURCES:
65
+ Buf.Append (" \x1b [38;5;242m" , 11 ); // Gray color for trace
66
+ break ;
67
+ default :
68
+ Buf.Append (" \x1b [0m" , 4 ); // Reset color for unknown
69
+ break ;
70
+ }
71
+ Buf.Append (rec.Data , rec.Len );
72
+ Buf.Append (" \x1b [0m" , 4 ); // Reset color
73
+ *Buf.Proceed (1 ) = ' \n ' ;
74
+ }
75
+
76
+ operator TLogRecord () const {
77
+ return TLogRecord (Priority, Buf.Data (), Buf.Filled ());
78
+ }
79
+ };
30
80
}
31
81
32
82
namespace NActors {
@@ -597,6 +647,7 @@ namespace NActors {
597
647
return new TSysLogBackend (ident.data (), TSysLogBackend::TSYSLOG_LOCAL1, flags);
598
648
}
599
649
650
+ template <typename TNewLineProcessor>
600
651
class TStderrBackend : public TLogBackend {
601
652
public:
602
653
TStderrBackend () {
@@ -614,7 +665,7 @@ namespace NActors {
614
665
bool isOk = false ;
615
666
do {
616
667
try {
617
- TRecordWithNewline r (rec);
668
+ TNewLineProcessor r (rec);
618
669
Cerr.Write (r.Buf .Data (), r.Buf .Filled ());
619
670
isOk = true ;
620
671
} catch (TSystemError err) {
@@ -661,8 +712,12 @@ namespace NActors {
661
712
TVector<TAutoPtr<TLogBackend>> UnderlyingBackends;
662
713
};
663
714
664
- TAutoPtr<TLogBackend> CreateStderrBackend () {
665
- return new TStderrBackend ();
715
+ TAutoPtr<TLogBackend> CreateStderrBackend (bool useColors) {
716
+ if (useColors) {
717
+ return new TStderrBackend<TRecordWithColorsAndNewline>();
718
+ } else {
719
+ return new TStderrBackend<TRecordWithNewline>();
720
+ }
666
721
}
667
722
668
723
TAutoPtr<TLogBackend> CreateFileBackend (const TString& fileName) {
0 commit comments