java - 如何使用log4j2和slf4j将日志存储在不同的日志表中?

标签 java logging configuration log4j2

我的问题是如何使用log4j2将日志存储在不同的表中。我以不同的方式对日志进行分类,即事务日志、异常日志和审核日志。我在Sqlserver-2008中创建了三个表,如Transaction_log、Exception_log和Audit_Logs。目前,所有日志仅存储在 Transaction_log 表中。现在我想将所有错误日志存储在 Exception_log 表中,所有信息日志存储在 Transaction_log 表中。如何使用 log4j2.xml 配置文件进行分类,我正在将 slf4j 与 log4j2 一起使用。如果有人有想法,请与我分享。在我使用 log4j 1.x 属性文件进行此开发之前。log4j1.x 属性文件是:

# Define the root logger with appender file
log4j.rootLogger =ALL,TXN, EXP,CONSOLE

    log4j.category.TransactionLog=INFO, TXN
    log4j.additivity.TransactionLog=false

    log4j.category.ExceptionLog=ERROR,EXP
    log4j.additivity.ExceptionLog=false

    #CONSOLE
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MMM dd HH:mm:ss}] %-5p (%F:%L) - %m%n



    #Transaction log config details

     log4j.appender.TXN=org.apache.log4j.jdbc.JDBCAppender
     log4j.appender.TXN.URL=jdbc:sqlserver://SERVERname;databaseName=******
     log4j.appender.TXN.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
     log4j.appender.TXN.user=*****
     log4j.appender.TXN.password=****
     log4j.appender.TXN.sql=INSERT INTO Transaction_Log(LoggedDate, MethodName, Level, ClassName, Message) VALUES (GETDATE(),'%M()',  '%-5p', '%C---%L','- %m%n' )

    #Exception log config details

    log4j.appender.EXP=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.EXP.URL=jdbc:sqlserver://SERVERname;databaseName=******
    # Set Database Driver
    log4j.appender.EXP.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
    log4j.appender.EXP.user=****
    log4j.appender.EXP.password=*****
    log4j.appender.EXP.sql=INSERT INTO Exception_Log(LoggedDate, MethodName, Level, ClassName, Message) VALUES (GETDATE(),'%M()',  '%-5p', '%C---%L','- %m%n' )

现在我需要像这样log4j2.xml。

我的 log4j.xml 文件是:

<?xml version="1.0" encoding="UTF-8"?>
  <configuration status="OFF">
  <appenders>
  <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
    <JDBC name="databaseAppender" tableName="Transaction_Log">
     <DataSource jndiName="java:/comp/env/jdbc/TestDB" />
       <Column name="LoggedDate" isEventTimestamp="true" />
       <Column name="MethodName" pattern="%M()" />
      <Column name="level" pattern="%level" isUnicode="false"  />
      <Column name="ClassName" pattern="%logger" isUnicode="false"  />
      <Column name="message" pattern="%m%n" isUnicode="false"  />
    </JDBC>
  </appenders>

  <loggers>
  <Logger name="org.apache.log4j.xml" level="all"/>
    <root level="all">
      <appender-ref ref="databaseAppender"/>
           <appender-ref ref="STDOUT"/>
    </root>
  </loggers>
</configuration>

最佳答案

根记录器可以有多个appender-ref,每个都有不同的级别。一个简单的例子:

<JDBC name="allEventsDatabaseAppender" tableName="tracedebuginfowarn_LOG">
    <Filters>
        <!-- Now deny error and fatal messages -->
        <ThresholdFilter level="error" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="fatal" onMatch="DENY"   onMismatch="NEUTRAL"/>
    </Filters>
    <DataSource jndiName="java:/comp/env/jdbc/TestDB" />
    ...
</JDBC>
...
<Root level="all">
  <AppenderRef ref="errorOnlyDatabaseAppender" level="ERROR" />
  <AppenderRef ref="allEventsDatabaseAppender" level="TRACE" />
  <AppenderRef ref="STDOUT"/>
</Root>
...

关于java - 如何使用log4j2和slf4j将日志存储在不同的日志表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28630030/

相关文章:

android - 为什么在 Android 模拟器中播放的音频带有回声/噪音?

java - OSGI:BundleContext.installBundle 线程安全吗?

java - 如何测试 null java Class<?>

python - Sentry 、乌鸦和 Django celery

java - Log4j 日志在错误的文件中滚动(在当天之前,跳过周末)

java - 无法为元素 RollingFile 创建 org.apache.logging.log4j.core.appender.RollingFileAppender 类型的插件

java - 泛型枚举中的方法引用

java - 无法在 hibernate 状态下同时使用 where 和 groupby

grails - 将log4j.xml放在Grails应用程序中的哪里?

.net - EnterpriseLibrary.Logging 出现 "loggingConfiguration"错误