首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >log4net应该如何正确地设置应用程序中的"EventLogAppender“的”源“?

log4net应该如何正确地设置应用程序中的"EventLogAppender“的”源“?
EN

Stack Overflow用户
提问于 2016-04-17 15:47:44
回答 1查看 2.1K关注 0票数 3

我有一个应用程序,包含多个部分。

我自始至终都在使用log4net记录事件,我希望这些事件有一个与它们来自何处的源相匹配的源(您知道" SOURCE“意味着什么)。因此,我在“应用程序和服务日志”下有一个日志,并按照您的预期设置了log4net。

在log4net中,配置中有一个元素"applicationName“,该元素根据文档指定”将存储消息的日志的名称“。

文档中的示例显示

代码语言:javascript
复制
<applicationName value="MyApp" />

Log4Net使用来自"applicationName“的值来记录事件。根据log4net源代码中的文档,应该使用"ApplicationName属性来区分事件“。

因此,假设LogName设置正确,我希望在事件查看器中看到“应用程序和服务日志”下的"LogName“,然后只需设置applicationName就可以得到正确的源代码。但是,applicationName似乎只在配置中设置.但这意味着所有事件都记录在同一个源中:

如何设置源名.?有别的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-17 15:47:44

我没有找到答案,所以我下载了log4net的源代码,并决定找出答案。

下面的代码片段将ApplicationName设置为log4net

代码语言:javascript
复制
    private static void SetEventSource(string sourceName)
    {
        var repository = LogManager.GetRepository();
        if (repository != null)
        {
            var appender = repository.GetAppenders().Where(x => x.Name == "eventLogAppender").FirstOrDefault();
            if (appender is log4net.Appender.EventLogAppender)
            {
                var eventAppender = (log4net.Appender.EventLogAppender)appender;
                eventAppender.ApplicationName = sourceName;
                eventAppender.ActivateOptions();
            }
        }
    }

我有一个"LoggingSources“的枚举,所以当应用程序开始确保日志源存在时,我只需要循环一遍。

代码语言:javascript
复制
    public static void ConfigureWindowsEvents()
    {
        // Create event log sources for each of our Logging types
        var loggingEvents = Enum.GetValues(typeof(LoggingSources));
        foreach (var item in loggingSources)
        {
            string source = item.ToString();

            if (!EventLog.SourceExists(source))
            {
                EventLog.CreateEventSource(source, EVENT_LOG_NAME);
            }
        }
    }

然后,当我记录一个事件时,我会设置源和事件id。

代码语言:javascript
复制
    public static void SetThreadContextAndLog(LoggingSources eventId, Action logAction)
    {
        if (logAction != null)
        {
            log4net.ThreadContext.Properties[EVENT_ID_KEY] = (int)eventId;
            try
            {
                SetEventSource(eventId.ToString());
                logAction(); 
            }
            finally
            {
                log4net.ThreadContext.Properties[EVENT_ID_KEY] = DEFAULT_EVENT_ID;
            }
        }
    }

按以下方式调用该方法..。

代码语言:javascript
复制
    public static void LogEvent(LoggingSources pEvent, string pMessage, EventLogEntryType pEventType)
    {
        SetThreadContextAndLog(pEvent, () =>
        {
            if (pEventType == EventLogEntryType.Warning)
            {
                Log.Warn(pMessage);
            }
        });
    }

这将导致正确设置源和事件id .

这有点像faff,但是我看不出一种更整洁的方式来设置日志源而不创建一个自定义的附录.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36678685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档