2010-10-05 10 views
5

मैं अपने सुरक्षा लॉगिंग/ऑडिटिंग से अपने normal लॉगिंग/ऑडिटिंग को कैसे अलग कर सकता हूं? विंडोज इवेंट लॉग एप्लिकेशन इवेंट्स और सुरक्षा घटनाओं के साथ इस भेद को बनाता है।कस्टम एनएलओजी लॉगलेवल या प्रति कक्षा एकाधिक लॉगर्स?

यदि मैं एक कस्टम लॉगलेवल बना सकता हूं, उदा। LogLevel.AuditSuccess या LogLevel.AuditFailure, तो मैं इन कॉन्फ़िगरेशन फ़ाइल नियमों को इन बराबर करने और उन घटनाओं को आउटपुट करने के लिए सेट कर सकता था। उदाहरण के लिए,

<logger name="*" levels="AuditSuccess,AuditFailure" writeTo="target1"/> 
<logger name="*" levels="DEBUG,INFO" writeTo="target1"/> 

तब मैं सिर्फ 1 तालिका इस्तेमाल कर सकते हैं, "स्तर" एक स्तंभ में रिकॉर्ड करते हैं, और खोज और इस स्तंभ की जानकारी का उपयोग कर अपने डेटा को सॉर्ट करने में सक्षम हो। (मुझे नहीं लगता कि हम एक कस्टम लॉगलेवल बना सकते हैं।)

एक वर्कअराउंड जो मैं आया हूं, प्रति वर्ग 2 लॉगर्स का उपयोग करना है - प्रत्येक लॉगर को एक अलग लक्ष्य में सहेजा जा रहा है। हालांकि, यह ओवरकिल की तरह लगता है, खासकर यदि मुझे अतिरिक्त समान प्रकार के प्रकार जोड़ने की आवश्यकता है।

<logger name="myNamespace.*" levels="INFO,ERROR" writeTo="target1"/> 
<logger name="mySecurityLogger" levels="INFO,ERROR" writeTo="target2"/> 

public class MyClass { 
    private static Logger _logger = LogManager.GetCurrentClassLogger(); 
    private statac Logger _loggerSecurity = LogManager.GetLogger("mySecurityLogger"); 
    ... 
} 

इसके साथ, मैं दो डेटाबेस लक्ष्य बना सकता हूं - प्रत्येक एक अलग तालिका के साथ - और फिर प्रत्येक गंतव्य लक्ष्य के लिए 1 नियम बनाएं।

कोई सुझाव?

उत्तर

6

यह नहीं हो सकता है क्या आप के बाद कर रहे हैं, लेकिन मेरे साथ सहन ...

आप NLog ऐसी है कि आप अपने खुद के "वालों" के साथ प्रवेश कर सकते हैं लपेट सकता है। NLog को लपेटने के उदाहरणों के लिए Common.Logging for .NET या SLF पर एक नज़र डालें (वे पूर्ण लॉगिंग अबास्ट्रक्शन हैं, इसलिए वे आपके बाद के मुकाबले अधिक जटिल हैं, लेकिन आप कुछ अच्छे विचार उठा सकते हैं)। here देखें (शायद आपको पहले यह देखना चाहिए कि आपको लगता है कि आपको एनएलओजी लॉगर को लपेटने या उप-वर्गीकरण करने में रुचि हो सकती है) उदाहरण के लिए एनएलओजी को सही तरीके से लपेटने के लिए उदाहरण के लिए (ध्यान दें कि कुंजी आपके प्रकार को पास करना है एनएलओजी लॉग विधि में लपेटा/उपclassed लॉगर)।

//Wrapped logger that you could create once in a class and use to log both 
//"normal" messages and "audit" messages. NLog log level is determined by the 
//logger configuration for the class. 
public class MyLogger 
{ 
    private Logger logger; //NLog logger 

    public MyLogger(string name) 
    { 
    logger = LogManager.GetLogger(name); 
    } 

    public void Info(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(LogLevel.Info, LogLevel.Info.ToString(), message); 
    } 

    public void AuditSuccess(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(LogLevel.Info, "AuditSuccess", message); 
    } 

    private void Write(LogLevel level, string customLevel, string message) 
    { 
    LogEventInfo le = new LogEventInfo(level, logger.Name, message); 
    le.Context["CustomLogLevel"] = customLevel; 
    logger.Log(typeof(MyLogger), le); 
    } 
} 

यह अपने कस्टम स्तरों के लिए इसी आप स्तर विशिष्ट प्रवेश तरीकों दे देंगे:

तो आप इस (संक्षिप्त) की तरह कुछ हो सकता है। यह आपको अपने "कस्टम स्तर" (using the event-context layout renderer) वाले कस्टम कॉलम को आउटपुट करने की क्षमता भी देगा। यह आपको "AuditSuccess" स्तर लॉगिंग चालू या बंद करने की क्षमता नहीं देता है। इसे अभी भी अंतर्निहित स्तरों द्वारा नियंत्रित किया जाना चाहिए।

वैकल्पिक रूप से, आप अपनी लिपटे वर्ग में दो लॉगर्स शामिल कर सकते हैं और अंतर्निहित स्तरों के लिए एक और दूसरे को कस्टम स्तर के लिए उपयोग कर सकते हैं। आपका आवरण इस प्रकार दिखाई देंगे:

//Wrapped logger that you could create once in a class and use to log both "normal" 
//and "audit" messages. NLog log level for each type of message is controllable 
//separately since the logger wrapper actually wraps two logger. 
public class MyLogger 
{ 
    private Logger logger; //NLog logger 
    private Logger auditLogger; 

    public MyLogger(string name) 
    { 
    logger = LogManager.GetLogger(name); 
    auditLogger = LogManager.GetLogger("AuditLogger"); 
    } 

    public void Info(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(logger, LogLevel.Info, LogLevel.Info.ToString(), messsage); 
    } 

    public void AuditSuccess(string message) 
    { 
    if (!auditLogger.IsInfoEnabled) return; 

    Write(auditLogger, LogLevel.Info, "AuditSuccess", message); 
    } 

    private void Write(Logger log, LogLevel level, string customLevel, string message) 
    { 
    LogEventInfo le = new LogEventInfo(level, log.Name, message); 
    le.Context["CustomLogLevel"] = customLevel; 
    log.Log(typeof(MyLogger), le); 
    } 
} 

आपको इसी प्रतिबंध के रूप में ऊपर सूचीबद्ध होता है, लेकिन आप कम से कम नियंत्रण "ऑडिट/सुरक्षा" से "सामान्य" लॉगिंग अलग से प्रवेश करने जा सका।

किसी भी मामले में, आप सभी लॉगर्स से आउटपुट को उसी डेटाबेस में भेज सकते हैं और केवल "स्तर" कॉलम के बजाय अपने "कस्टम स्तर" कॉलम पर अपने प्रश्न पूछ सकते हैं।

सुरक्षा Security.Audit सुरक्षा: आप कैसे कई सुरक्षा/लेखा परीक्षा "श्रेणियों" के आधार पर, आप भी एक ठोस पदानुक्रम आप NLog कॉन्फ़िग फ़ाइल में लकड़हारा पदानुक्रम का लाभ ले सकते ऐसी है कि बनाने के लिए चाहते हो सकता है। Audit.Success सुरक्षा। Adit.Failure सुरक्षा।लॉगिन Security.Login.Success Security.Login.Failure स्वास्थ्य Health.Heartbeat Health.Whatever

तो फिर तुम सुरक्षा या Security.Audit या "चालू" सकता है। विफलता (सुनिश्चित नहीं है कि वह अंतिम काम करता है या नहीं)।

उम्मीद है कि इससे मदद मिलती है।

3

क्या आप अपनी कक्षा में दो अलग-अलग नामित लॉगर्स का उपयोग नहीं कर सकते, उसी लक्ष्य पर आउटपुट कर सकते हैं और ${logger} layout renderer का उपयोग फील्ड मान के रूप में कर सकते हैं?

ईमानदारी से, यदि ये कार्यक्रम एप्लिकेशन डोमेन में बहुत महत्वपूर्ण हैं, तो शायद उन्हें लॉगिंग फ्रेमवर्क के माध्यम से रिकॉर्ड करना गलत तरीका है। शायद यह आपके आवेदन में एक और स्पष्ट रूप से मॉडलिंग अवधारणा होना चाहिए। बेशक, यदि आपको अन्य लॉग संदेशों के समान ईवेंट डेटा को स्टोर करना आवश्यक है, तो हो सकता है कि आपके पास वह विकल्प न हो।

अन्यथा, मैं कस्टम लॉगिंग स्तर से दूर रहना चाहता हूं, क्योंकि वे वास्तव में उन्हें जोड़ने की परेशानी के लायक साबित नहीं हुए हैं।

संबंधित मुद्दे