log4j2 - log4j2 appender 与 sql server 数据库对话
问题描述
这个网址
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>
当我尝试连接到 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>
我收到如下错误:
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'
如何在 xml-configuration 中设置连接字符串以与 sqlserver 通信?
即使它与文档不匹配,我也尝试了这个:
<Appenders>
<JDBC name="SQLServerAppender" tableName="dbo.LogEntry">
<ConnectionSource jndiName="jdbc:sqlserver
它当然没有用。
什么是神奇的语法糖??#帮助
谢谢。
解决方案
的值DataSource jndiName
不是 SQL Server 连接字符串。如果你想使用 SQL Server 连接字符串,那么在 Log4J 配置中输入类似:
<appender name="SQLServer" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="url" value="jdbc:sqlserver://MyMachine\\MyInstance:1433;databaseName=LoggingDB;applicationName=myappname;"/>
<param name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<param name="user" value="user_id"/>
<param name="password" value="password"/>
<param name="sql" value="INSERT INTO LOG4J_TABLE VALUES('%x','%d','%C','%p','%m')"/>
<layout class="org.apache.log4j.PatternLayout"></layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="SQLServer"/>
</logger>
这将写入您之前必须创建的表,例如:
CREATE TABLE LOG4J_TABLE (
User_Id VARCHAR(20) NOT NULL,
Date_Stamp DATETIME NOT NULL,
Logger VARCHAR(100) NOT NULL,
Level VARCHAR(10) NOT NULL,
Message VARCHAR(8000) NOT NULL
)
请注意,您不能integratedSecurity=true
直接从 Java 中使用,但必须指定用户 + 密码。
推荐阅读
- css - 保证金没有在 div 上给出任何结果
- reactjs - 反应 this.state 为空
- c# - 使用 ShouldSkipRecord 过滤 CSVHelper 中的日期范围
- rest - IDDD 红皮书:第 13 章集成限界上下文,RESTful 时间解耦
- mysql - 如何将 Web 应用程序链接到 MySQL Azure 数据库?
- arrays - 围绕数组中的最大值进行分区的算法的最佳和最坏情况是什么?
- python - 在pygame中按住鼠标单击时如何阻止变量增加
- javascript - AngularJS + webpack如何散列模板html
- python - 使用 einsum 在傅立叶域中实现 conv2d --> ValueError: einstein sum subscripts string contains too many subscripts for operand 0
- reactjs - 如何在
标签?