C# NLog: Почему он не выдает результат?C#

Место общения программистов C#
Ответить
Anonymous
 C# NLog: Почему он не выдает результат?

Сообщение Anonymous »

В моем приложении C# (.NET Framework 4.8.1) я хочу выполнить журналирование и обмен сообщениями. Для этой цели я решил использовать NLOG и хочу настраивать это не с помощью файла конфигурации, а программно. Также мне нужны два регистратора: один для регистрации в консоли и файле журнала, другой для регистрации только в памяти. Вот как я создаю регистраторы в своем классе:

Код: Выделить всё

internal static class Logger
{
private static NLog.Logger _logger = null;
private static NLog.Logger _message = null;
private static ColoredConsoleTarget _consoleTarget = null;
private static FileTarget _fileTarget = null;
private static MemoryTarget _memTarget = null;

private const string _loggerName = "logger";
private const string _loggerConsoleTarget = "consoleTarget";
private const string _loggerFileTarget = "fileTarget";
private const string _memoryTarget = "memTarget";
private const string _loggerRule = "loggerRule";
private const string _messageLoggerName = "messageLogger";
private const string _messageLoggerRule = "messageRule";

// access file and console logger
public static NLog.Logger Log
{
get
{
if (_logger == null) CreateLogger();
return _logger;
}
}

// access memory logger
public static NLog.Logger Msg
{
get
{
if (_message == null) CreateMessage();
return _message;
}
}

// get memory logger content
public static IList MemoryLog
{
get
{
MemoryTarget target = LogManager.Configuration.FindTargetByName(_memoryTarget);
return target == null ? new List() : target.Logs;
}
}

public static bool hasMemoryLog
{

get
{
MemoryTarget target = LogManager.Configuration.FindTargetByName< MemoryTarget>(_memoryTarget);
return target != null && target.Logs.Count >  0;
}
}

private static FileTarget CreateFileTarget()
{
FileTarget fileTarget = new FileTarget(_loggerFileTarget)
{
FileName = Path.Combine(ConnectionHandler.UserDataFolder, $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.log"),
ArchiveAboveSize = 1024 * 1024 * 10, // 10 MB
MaxArchiveFiles = 10,
ArchiveNumbering = ArchiveNumberingMode.Rolling
};
return fileTarget;
}

// create file and console logger
public static void CreateLogger()
{
_logger = LogManager.GetLogger(_loggerName);

if (LogManager.Configuration == null)
LogManager.Configuration = new LoggingConfiguration();

_consoleTarget = new ColoredConsoleTarget(_loggerConsoleTarget);
LogManager.Configuration.AddTarget(_consoleTarget);
_fileTarget = CreateFileTarget();
LogManager.Configuration.AddTarget(_fileTarget);

LoggingRule rule = new LoggingRule(_loggerRule);
rule.Targets.Add(_consoleTarget);
rule.Targets.Add(_fileTarget);
rule.SetLoggingLevels(LogLevel.Info, LogLevel.Fatal);
rule.LoggerNamePattern = _loggerName;

LogManager.Configuration.AddRule(rule);
}

// create memory logger
private static void CreateMessage()
{
_message = LogManager.GetLogger(_messageLoggerName);

if (LogManager.Configuration == null)
LogManager.Configuration = new LoggingConfiguration();

_memTarget = new MemoryTarget(_memoryTarget);
LogManager.Configuration.AddTarget(_memTarget);

LoggingRule rule = new LoggingRule(_messageLoggerRule);
rule.Targets.Add(_memTarget);
rule.SetLoggingLevels(LogLevel.Trace, LogLevel.Info);
rule.LoggerNamePattern = _messageLoggerName;

}

public static void DestroyLogger()
{
if (_logger == null) return;

LogManager.Configuration.RemoveTarget(_loggerConsoleTarget);
LogManager.Configuration.RemoveTarget(_loggerFileTarget);
LogManager.Configuration.RemoveRuleByName(_loggerRule);

_logger = null;
_consoleTarget = null;
if (_message == null)
_fileTarget = null;
}

public static void DestroyMessage()
{
if (_message == null) return;

LogManager.Configuration.RemoveTarget(_memoryTarget);
LogManager.Configuration.RemoveRuleByName(_messageLoggerRule);

_memTarget = null;
_message = null;
if (_logger == null)
_fileTarget = null;
}

public static void ClearMessageLog()
{
if (_memTarget == null) return;
_memTarget.Logs.Clear();
}

public static void setMinLogLevel(LogLevel level)
{
LoggingRule rule = LogManager.Configuration.FindRuleByName(_loggerRule);
rule.SetLoggingLevels(level, LogLevel.Fatal);
}

}
Сначала я вызываю CreateLogger, затем вызываю Logger.Log.Info("некоторый текст журнала"). Итак, вкратце:

Код: Выделить всё

        _logger = LogManager.GetLogger(_loggerName);

if (LogManager.Configuration == null)
LogManager.Configuration = new LoggingConfiguration();

_consoleTarget = new ColoredConsoleTarget(_loggerConsoleTarget);
LogManager.Configuration.AddTarget(_consoleTarget);
_fileTarget = CreateFileTarget();
LogManager.Configuration.AddTarget(_fileTarget);

LoggingRule rule = new LoggingRule(_loggerRule);
rule.Targets.Add(_consoleTarget);
rule.Targets.Add(_fileTarget);
rule.SetLoggingLevels(LogLevel.Info, LogLevel.Fatal);
rule.LoggerNamePattern = _loggerName;

LogManager.Configuration.AddRule(rule);

_logger.Info("som log text");
По неизвестной (мне) причине он ничего не регистрирует. Когда я вызываю Logger.Log.Info(logmessage), он ничего не записывает ни в консоль, ни в файл. Когда я вхожу в метод Info, он показывает, что «IsInfoEnabled» имеет значение false, хотя я установил соответствующие уровни журнала для правил. В правилах соответствующие записи массива уровня журнала имеют значение true.
Я надеюсь, что кто-нибудь сможет мне помочь и сказать, что я делаю неправильно. Я несколько дней копался в сети, но большинство статей относятся к методу файла конфигурации. В документации NLog нет примеров (или я их не нашел) и она мало что говорит.
Заранее спасибо,
joerg< /п>

Подробнее здесь: https://stackoverflow.com/questions/793 ... uce-output
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»