Log4j数据库appender

Mat*_*ieu 9 java logging log4j

我希望log4j在MySql数据库中记录我的错误,但官方文档相当稀疏(为什么?).无论如何,这是我对log4j.xml配置文件的尝试:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="jdbcAppender" class="org.apache.log4j.jdbc.JDBCAppender"> 
    <param name="URL" value="jdbc:mysql://my_host/my_database" /> 
    <param name="Driver" value="com.mysql.jdbc.Driver" /> 
    <param name="User" value="my_user_name" /> 
    <param name="Password" value="my_passwod" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
        <param name="ConversionPattern" 
          value="INSERT INTO errorlogs (Date, log_level, Application, Message, Exception) VALUES (TIMESTAMP(now()),'%p', ?? '%m', '%e' )"
        /> 
    </layout> 
</appender> 
Run Code Online (Sandbox Code Playgroud)

我需要"Application"参数进行自定义.使用C#中的log4net,在我的代码中我会添加如下:

log4net.GlobalContext.Properties["Application"] = applciation;
Run Code Online (Sandbox Code Playgroud)

并在我的xml配置文件中添加它:

<parameter>
    <parameterName value="?application" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%property{Application}" />
    </layout>
  </parameter>
Run Code Online (Sandbox Code Playgroud)

我想知道如何用log4j做同样的事情?

谢谢!

Mat*_*ieu 6

好的,我发现如何做到这一点归功于这篇文章:Log4J Custom Fields

基本上,我使用MDC添加我的自定义字段,如下所示:

MDC.put("Application", application);
Run Code Online (Sandbox Code Playgroud)

在我的配置文件中,我使用%X {property_name}来获取值.像这样:

<layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" 
      value="INSERT INTO errorlogs (Date, log_level, Application, Message, Exception) VALUES (TIMESTAMP(now()),'%p', '%X{Application}' '%m', '%e' )"
    /> 
</layout> 
Run Code Online (Sandbox Code Playgroud)