c# - 使用 log4net 在运行时读取并记录 HttpSession 数据

标签 c# logging asp.net-mvc-4 log4net

这可能是不可能的,但我想知道是否有办法让它发挥作用。

我有一个大型 ASP.NET MVC43 应用程序,它已经使用日志记录语句进行了检测。

现在我们需要在每个日志条目中包含来自 Session 对象的“公司名称”值。是否可以配置 log4net 来读取 session 数据并将其包含在日志条目中?或者有什么方法可以强制它......?

感谢您的任何想法。

[编辑] 这个问题很有帮助:How can I include SessionID in log files using log4net in ASP.NET?

我最终将此作为我的解决方案:

在 Global.asax.cs 中:

    // After the session is acquired, push the organization code into log4net's thread context, in case it has to log anything.
    protected void Application_PostAcquireRequestState(object sender, EventArgs e)
    {
        if (Context.Handler is IRequiresSessionState && Session != null && Session[Constants.EMPLOYEE_DETAILS] != null)
                log4net.ThreadContext.Properties["Company"] = ((EmployeeDetails)Session[Constants.EMPLOYEE_DETAILS]).Company;
    }

在 log4net 配置中:

  <parameter>
    <parameterName value="@Company"/>
    <dbType value="String"/>
    <size value="10"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%property{Company}" />
    </layout>
  </parameter>

效果很好 - 我现在在日志输出中得到一个公司名称。谢谢大家的帮助。

最佳答案

使用自定义布局转换器

public class CompanyLayoutConverter : PatternLayoutConverter
{
    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
         var httpContext = HttpContext.Current;
         if (httpContext == null)
             return;

         writer.Write(httpContext.Session["Company Name"]);
    }
}

将此转换器添加到附加布局,公司名称将出现在输出中(只需在 conversionPattern 值中使用 %company ):

<appender name="RollingLogFileAppender" 
          type="log4net.Appender.RollingFileAppender">
  <threshold value="All" />
  <file value="C:\LogFile" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value="'.'yyyyMMdd'.log.txt'" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <converter>
      <name value="company"/>
      <type value="Foo.Bar.CompanyLayoutConverter"/>
    </converter>
    <conversionPattern value="%date %-5level %logger - %company %message%newline" />
  </layout>
</appender>

关于c# - 使用 log4net 在运行时读取并记录 HttpSession 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13691240/

相关文章:

c# - 如何使用作为代码?

c# - 使用正则表达式匹配由 - 分隔的字符串

python - 如何记录变量的名称和值?

java - 如何覆盖/增加包的 Java 日志记录级别?

asp.net-mvc-4 - 自签名 SSL 证书 - CN 是否需要位于证书所在位置(我的应用程序的 URL)?

authentication - ASP.NET MVC4 安全、身份验证和授权

asp.net-mvc-4 - 在 MVC4 中使用时 AUTH_USER 返回空白

c# - 为什么我无法调用 DbContextOptionsBuilder 上的 UseInMemoryDatabase 方法?

c# - 我应该如何在 C# 中使用 debug.print

python - 更改外部包的记录器类