एनएलओजी मुझे कई संदेशों पर लॉग इन करने के लिए SplitGroup
का उपयोग करने की अनुमति देता है। मैं एक बार में एक आम, उपयोगकर्ता-विशिष्ट और तारीख विशेष लॉग को लॉग प्रत्येक संदेश को इस सुविधा का उपयोग करना चाहते हैं:एनएलओजी में एक ही लक्ष्य के लिए विभिन्न लेआउट कैसे लागू करें?
<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>
यह महान है, लेकिन मैं भी के लिए विभिन्न लेआउट का उपयोग करना चाहते गंभीरता के विभिन्न स्तर। उदाहरण के लिए, errorLayout
अपवाद जानकारी शामिल और सम्मिलित [!]
मार्कर तो मैं बाद में 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>
इस कोड को मान लिया गया Error
रों हमेशा अपवादों के साथ आते हैं और Warning
रों नहीं है, लेकिन वह नहीं है बिंदु।
समस्या है यह कॉन्फ़िगरेशन गलत है। यह काम नहीं करेगा क्योंकि logger
में layout
विशेषता नहीं है। यह केवल target
के लिए परिभाषित किया गया है।
लेआउट जिसका उपयोग किया जा रहा है, लक्ष्य को स्वयं घोषित किया जाना चाहिए, लेकिन मुझे विभिन्न गंभीरता स्तरों के लिए अलग-अलग लेआउट निर्दिष्ट करने का कोई मतलब नहीं दिखता है।
<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>
यह सिर्फ मेरी आँखों दर्द होता है:
अभी के लिए, मैं सिर्फ फाइलों का एक ही सेट के लिए चार अलग-अलग layout
रों है करने के लिए एक ही विन्यास कोड चार बार कॉपी-पेस्ट करने के लिए किया था।
क्या ऐसा करने का कोई बेहतर तरीका है और नकल से बचें?
आपकी टिप्पणी के लिए धन्यवाद। अभी के लिए मैं न्यूनतम निर्भरताओं के साथ रहना चाहता हूं लेकिन जब मैं सिस्टम को पुन: इंजीनियर करता हूं, तो शायद मैं इसे कार्यान्वित करूंगा। –