NLog me permite usar SplitGroup
para registrar mis mensajes en varios destinos. Me gustaría utilizar esta función para registro de cada mensaje a una, registros específicos del usuario y la fecha específica comunes a la vez:¿Cómo aplicar diferentes diseños al mismo objetivo en NLog?
<variable name="commonLog" value="${logDir}\Common.log" />
<variable name="username" value="${identity:fSNormalize=true:authType=false:isAuthenticated=false}" />
<variable name="userLog" value="${logDir}\ByUser\${username}.log" />
<variable name="dateLog" value="${logDir}\ByDate\${shortdate}.log" />
<target name="logFiles" xsi:type="SplitGroup">
<target xsi:type="File" fileName="${commonLog}" layout="${myLayout}" />
<target xsi:type="File" fileName="${userLog}" layout="${myLayout}" />
<target xsi:type="File" fileName="${dateLog}" layout="${myLayout}" />
</target>
Esto es muy bueno, pero también quiero utilizar diferentes diseños para diferentes niveles de severidad. Por ejemplo, errorLayout
incluiría información de excepción e insertar [!]
marcador por lo que más tarde podría poner de relieve los errores en los espectadores de registro como BareTail:
<variable name="stamp" value="${date} ${username} ${logger}" />
<variable name="debugLayout" value="${stamp} ... ${message}" />
<variable name="infoLayout" value="${stamp} [i] ${message}" />
<variable name="warnLayout" value="${stamp} [!] ${message}" />
<variable name="errorLayout"
value="${warnLayout}${newline}${pad:padding=10:inner=${exception:format=ToString}}" />
<!-- logFiles target -->
<rules>
<logger name="*" level="Debug" writeTo="logFiles" layout="debugLayout" />
<logger name="*" level="Info" writeTo="logFiles" layout="infoLayout" />
<logger name="*" level="Warn" writeTo="logFiles" layout="warnLayout" />
<logger name="*" level="Error" writeTo="logFiles" layout="errorLayout" />
</rules>
Este código asume Error
s siempre vienen con excepciones y Warning
s no lo hacen, pero ese no es el punto.
El problema es esta configuración es incorrecta. No funcionará porque logger
no tiene el atributo layout
. Está definido solo para target
.
El diseño que se está utilizando debe ser declarado por los propios objetivos, pero no veo ninguna forma de especificar diseños diferentes para diferentes niveles de gravedad.
Por ahora, tuve que copiar y pegar el mismo código de configuración cuatro veces sólo para tener cuatro layout
s diferentes para un mismo conjunto de archivos:
<targets>
<target name="logFilesDebug" xsi:type="SplitGroup">
<target xsi:type="File" fileName="${commonLog}" layout="${debugLayout}" />
<target xsi:type="File" fileName="${userLog}" layout="${debugLayout}" />
<target xsi:type="File" fileName="${dateLog}" layout="${debugLayout}" />
</target>
<target name="logFilesInfo" xsi:type="SplitGroup">
<target xsi:type="File" fileName="${commonLog}" layout="${infoLayout}" />
<target xsi:type="File" fileName="${userLog}" layout="${infoLayout}" />
<target xsi:type="File" fileName="${dateLog}" layout="${infoLayout}" />
</target>
<target name="logFilesWarn" xsi:type="SplitGroup">
<target xsi:type="File" fileName="${commonLog}" layout="${warnLayout}" />
<target xsi:type="File" fileName="${userLog}" layout="${warnLayout}" />
<target xsi:type="File" fileName="${dateLog}" layout="${warnLayout}" />
</target>
<target name="logFilesError" xsi:type="SplitGroup">
<target xsi:type="File" fileName="${commonLog}" layout="${errorLayout}" />
<target xsi:type="File" fileName="${userLog}" layout="${errorLayout}" />
<target xsi:type="File" fileName="${dateLog}" layout="${errorLayout}" />
</target>
</targets>
<rules>
<logger name="*" level="Debug" writeTo="logFilesDebug" />
<logger name="*" level="Info" writeTo="logFilesInfo" />
<logger name="*" level="Warn" writeTo="logFilesWarn" />
<logger name="*" level="Error" writeTo="logFilesError" />
</rules>
Esto sólo duelen los ojos.
¿Hay alguna manera mejor de hacer esto y evitar la duplicación?
Gracias por su comentario. Por ahora quiero mantener dependencias mínimas, pero cuando reinvente el sistema, quizás lo implemente. –