Is it possible, when creating a log using NLog, to record information in one file, say text, using a different design for output ( layout ) depending on the layer ( level ). Suppose the appearance for the Error layer is one, and for the Debug layer - another.

And accordingly, when called in the application

 Logger logger = LogManager.GetCurrentClassLogger(); //здесь бы использовался более подробный шаблон //с выводом информации об исключении допустим logger.Error(ex, "message"); //здесь использовалась более упрощенное - дата и сообщение logger.Debug("message") 

    2 answers 2

    If you need to record additional. information with an exception - $ {onexception} will help you.

    If you need more complex logic, create your layout renderer, which will follow this logic. You can take the same $ {onexception} as a basis and make $ {onerror}, $ {onwarn}, $ {oninfo}, etc., based on it.

    But, how much I use NLog - and never faced such need. Usually, on the contrary, it is better to keep the logs monotonous. Perhaps you really should be different levels simply split into different files.

    • I extract additional information from the ex error, for example, the Exception message : ${exception: format=Message}${newline} . It’s just that when calling a debug error, there will be no transmitted error and I wanted to change the template - e1s
    • @ e1s you better not guess about the presence or absence of an error based on the level - just check for an error. Through $ {onexception} - Pavel Mayorov
    • try ... catch it will appear anyway, solved its problem by creating two targeta that point to one physical file, I don’t know if this is the right approach, but at first glance it works - e1s
    • @ e1s tell me what makes you unhappy $ {onexception}? It seems that we speak different languages ​​... And no, one physical file for different targets is not a good idea. - Pavel Mayorov 1:16 pm
    • I still do not understand how to use this ${onexception:inner=Layout} construct, should I put it in the target as an alternative Layout? - e1s

    my nlog.config

     <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" > <!-- optional, add some variabeles https://github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <!-- See https://github.com/nlog/nlog/wiki/Configuration-file for information on customizing logging rules and outputs. --> <targets> <!-- add your targets here See https://github.com/nlog/NLog/wiki/Targets for possible targets. See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. --> <target name="console" xsi:type="Console" layout="${date:format=HH\:mm\:ss}|${level}|${message}" /> <target name="file" xsi:type="File" fileName="${basedir}/logs/Log.${level}.current.txt" layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}" archiveFileName="${basedir}/logs/archives/log.error.${shortdate}.{#}.txt" archiveAboveSize="5242880" archiveEvery="Day" archiveNumbering = "Rolling" maxArchiveFiles="3" /> <!-- Writing events to the a file with the date in the filename. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> --> </targets> <rules> <!-- add your logging rules here --> <logger name="*" minlevel="Debug" writeTo="file" /> <logger name="*" minlevel="Trace" writeTo="console" /> <!-- Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" /> --> </rules> </nlog> 

    for different levels are different paths. that is, with Debug, there will be a mapping to the console and writing to the file. and with Trace only console. it is necessary to take into account that there is a hierarchy of events, and the higher ones include lower ones. but I think that the target can be written another way to the file