log4j2 附加程序与 sql server 数据库对话

gra*_*der 5 log4j2

这个网址

https://logging.apache.org/log4j/log4j-2.0/manual/appenders.html

有这个例子:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
  <Appenders>
    <JDBC name="databaseAppender" tableName="dbo.application_log">
      <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
      <Column name="eventDate" isEventTimestamp="true" />
      <Column name="level" pattern="%level" />
      <Column name="logger" pattern="%logger" />
      <Column name="message" pattern="%message" />
      <Column name="exception" pattern="%ex{full}" />
    </JDBC>
  </Appenders>
  <Loggers>
    <Root level="warn">
      <AppenderRef ref="databaseAppender"/>
    </Root>
  </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

当我尝试连接到 sqlserver 数据库时......

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
   <Appenders>
      <JDBC name="SQLServerAppender" tableName="dbo.LogEntry">
         <DataSource jndiName="jdbc:sqlserver://MyMachine\\MyInstance:1433;databaseName=LoggingDB;applicationName=myappname;integratedSecurity=true;" />
         <Column name="EntryDateUtc" isEventTimestamp="true" />
         <Column name="LOGGER" pattern="%C" />
         <Column name="Level" pattern="%level" />
         <Column name="Message" pattern="%m" />
         <Column name="UserName" pattern="%x" />
         <Column name="Priority" pattern="%p" />
         <Column name="ElapsedMilliseconds" pattern="%r" />
         <Column name="ThreadName" pattern="%t" />
         <Column name="ThrowableMessage" pattern="%throwable " />
      </JDBC>
Run Code Online (Sandbox Code Playgroud)

我收到如下错误:

ERROR No ConnectionSource provided: connectionSource
ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender for element JDBC org.apache.logging.log4j.core.config.ConfigurationException: Arguments given for element JDBC are invalid: field 'connectionSource' has invalid value 'null'
Run Code Online (Sandbox Code Playgroud)

如何在 xml 配置中设置连接字符串来与 sqlserver 通信?

尽管它与文档不匹配,但我尝试了以下方法:

   <Appenders>
      <JDBC name="SQLServerAppender" tableName="dbo.LogEntry">

         <ConnectionSource jndiName="jdbc:sqlserver
Run Code Online (Sandbox Code Playgroud)

当然没用。

神奇的语法糖是什么??#帮助

谢谢。

Ser*_*Ten 0

的价值DataSource jndiName不是 SQL Server 连接字符串。如果您想使用 SQL Server 连接字符串,请在 Log4J 配置中输入如下内容:

\n\n
<appender name="SQLServer" class="org.apache.log4j.jdbc.JDBCAppender">\n   <param name="url" value="jdbc:sqlserver://MyMachine\\\\MyInstance:1433;databaseName=LoggingDB;applicationName=myappname;"/>\n   <param name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>\n   <param name="user" value="user_id"/>\n   <param name="password" value="password"/>\n   <param name="sql" value="INSERT INTO LOG4J_TABLE VALUES(\'%x\',\'%d\',\'%C\',\'%p\',\'%m\')"/>\n   <layout class="org.apache.log4j.PatternLayout"></layout>\n</appender>\n\n<logger name="log4j.rootLogger" additivity="false">\n   <level value="DEBUG"/>\n   <appender-ref ref="SQLServer"/>\n</logger>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将写入您之前必须创建的表,例如:

\n\n
CREATE TABLE LOG4J_TABLE (\nUser_Id     VARCHAR(20)    NOT NULL,\nDate_Stamp  DATETIME       NOT NULL,\nLogger      VARCHAR(100)   NOT NULL,\nLevel       VARCHAR(10)    NOT NULL,\nMessage     VARCHAR(8000)  NOT NULL\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您可以\xc2\xb4t 使用integratedSecurity=true,但必须指定用户 + 密码。

\n