< Summary

Information
Class: Ice.ConsoleListener
Assembly: Ice
File(s): /_/csharp/src/Ice/LoggerI.cs
Tag: 91_21789722663
Line coverage
75%
Covered lines: 12
Uncovered lines: 4
Coverable lines: 16
Total lines: 239
Line coverage: 75%
Branch coverage
50%
Covered branches: 2
Total branches: 4
Branch coverage: 50%
Method coverage
50%
Covered methods: 2
Total methods: 4
Method coverage: 50%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_IsThreadSafe()100%210%
TraceEvent(...)50%4.06484.62%
Write(...)100%210%
WriteLine(...)100%11100%

File(s)

/_/csharp/src/Ice/LoggerI.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3#nullable enable
 4
 5using System.Diagnostics;
 6using System.Globalization;
 7
 8namespace Ice;
 9
 10internal abstract class LoggerI : Logger
 11{
 12    public void print(string message)
 13    {
 14        lock (_globalMutex)
 15        {
 16            write(message);
 17        }
 18    }
 19
 20    public virtual void trace(string category, string message)
 21    {
 22        string s = format("--", category, message);
 23        lock (_globalMutex)
 24        {
 25            write(s);
 26        }
 27    }
 28
 29    public virtual void warning(string message)
 30    {
 31        string s = format("-!", "warning", message);
 32        lock (_globalMutex)
 33        {
 34            write(s);
 35        }
 36    }
 37
 38    public virtual void error(string message)
 39    {
 40        string s = format("!!", "error", message);
 41        lock (_globalMutex)
 42        {
 43            write(s);
 44        }
 45    }
 46
 47    public string getPrefix() => _prefix;
 48
 49    public abstract Logger cloneWithPrefix(string prefix);
 50
 51    public abstract void Dispose();
 52
 53    protected abstract void write(string message);
 54
 55    internal LoggerI(string prefix)
 56    {
 57        _prefix = prefix;
 58
 59        if (prefix.Length > 0)
 60        {
 61            _formattedPrefix = prefix + ": ";
 62        }
 63
 64        _date = "d";
 65        _time = "HH:mm:ss:fff";
 66    }
 67
 68    private string format(string prefix, string category, string message)
 69    {
 70        var s = new System.Text.StringBuilder(prefix);
 71        s.Append(' ');
 72        s.Append(System.DateTime.Now.ToString(_date, CultureInfo.CurrentCulture));
 73        s.Append(' ');
 74        s.Append(System.DateTime.Now.ToString(_time, CultureInfo.CurrentCulture));
 75        s.Append(' ');
 76        s.Append(_formattedPrefix);
 77        s.Append(category);
 78        s.Append(": ");
 79        s.Append(message);
 80        s.Replace("\n", "\n   ");
 81        return s.ToString();
 82    }
 83
 84    internal static object _globalMutex = new object();
 85    internal readonly string _prefix;
 86    internal readonly string? _formattedPrefix;
 87    internal string _date;
 88    internal string _time;
 89}
 90
 91internal sealed class ConsoleLoggerI : LoggerI
 92{
 93    public override Logger cloneWithPrefix(string prefix) => new ConsoleLoggerI(prefix);
 94
 95    public override void Dispose()
 96    {
 97        // Nothing to do.
 98    }
 99
 100    protected override void write(string message) => System.Console.Error.WriteLine(message);
 101
 102    internal ConsoleLoggerI(string prefix)
 103        : base(prefix)
 104    {
 105        _date = "d";
 106        _time = "HH:mm:ss:fff";
 107    }
 108}
 109
 110internal sealed class FileLoggerI : LoggerI
 111{
 112    public override Logger cloneWithPrefix(string prefix) => new FileLoggerI(prefix, _file);
 113
 114    public override void Dispose()
 115    {
 116        _writer.Close();
 117        _writer.Dispose();
 118    }
 119
 120    protected override void write(string message)
 121    {
 122        _writer.WriteLine(message);
 123        _writer.Flush();
 124    }
 125
 126    internal FileLoggerI(string prefix, string file)
 127        : base(prefix)
 128    {
 129        _file = file;
 130        _writer = new StreamWriter(new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.ReadWrite));
 131    }
 132
 133    private readonly string _file;
 134    private readonly TextWriter _writer;
 135}
 136
 137internal class ConsoleListener : TraceListener
 138{
 0139    public override bool IsThreadSafe => true;
 140
 141    public override void TraceEvent(
 142        TraceEventCache? cache,
 143        string source,
 144        TraceEventType type,
 145        int id,
 146        string? message)
 147    {
 148        System.Text.StringBuilder s;
 1149        if (type == TraceEventType.Error)
 150        {
 0151            s = new System.Text.StringBuilder("!!");
 152        }
 1153        else if (type == TraceEventType.Warning)
 154        {
 1155            s = new System.Text.StringBuilder("-!");
 156        }
 157        else
 158        {
 0159            s = new System.Text.StringBuilder("--");
 160        }
 1161        s.Append(' ');
 1162        s.Append(System.DateTime.Now.ToString(_date, CultureInfo.CurrentCulture));
 1163        s.Append(' ');
 1164        s.Append(System.DateTime.Now.ToString(_time, CultureInfo.CurrentCulture));
 1165        s.Append(' ');
 1166        s.Append(message);
 1167        WriteLine(s.ToString());
 1168    }
 169
 0170    public override void Write(string? message) => System.Console.Error.Write(message);
 171
 1172    public override void WriteLine(string? message) => System.Console.Error.WriteLine(message);
 173
 174    internal const string _date = "d";
 175    internal const string _time = "HH:mm:ss:fff";
 176}
 177
 178internal sealed class TraceLoggerI : LoggerI
 179{
 180    public override void trace(string category, string message)
 181    {
 182        Trace.TraceInformation(format(category, message));
 183        Trace.Flush();
 184    }
 185
 186    public override void warning(string message)
 187    {
 188        Trace.TraceWarning(format("warning", message));
 189        Trace.Flush();
 190    }
 191
 192    public override void error(string message)
 193    {
 194        string s = format("error", message);
 195        {
 196            Trace.TraceError(s);
 197            Trace.Flush();
 198        }
 199    }
 200
 201    public override Logger cloneWithPrefix(string prefix) => new TraceLoggerI(prefix, _console);
 202
 203    public override void Dispose()
 204    {
 205        if (_console && Trace.Listeners.Contains(_consoleListener))
 206        {
 207            Trace.Listeners.Remove(_consoleListener);
 208        }
 209    }
 210
 211    protected override void write(string message)
 212    {
 213        Trace.WriteLine(message);
 214        Trace.Flush();
 215    }
 216
 217    internal TraceLoggerI(string prefix, bool console)
 218        : base(prefix)
 219    {
 220        _console = console;
 221        if (console && !Trace.Listeners.Contains(_consoleListener))
 222        {
 223            Trace.Listeners.Add(_consoleListener);
 224        }
 225    }
 226
 227    private string format(string category, string message)
 228    {
 229        var s = new System.Text.StringBuilder(_formattedPrefix);
 230        s.Append(category);
 231        s.Append(": ");
 232        s.Append(message);
 233        s.Replace("\n", "\n   ");
 234        return s.ToString();
 235    }
 236
 237    private readonly bool _console;
 238    internal static ConsoleListener _consoleListener = new ConsoleListener();
 239}