我正在尝试使用log4net的内置adonetappender登录我的redshift服务器。删除时间戳字段后,将成功保存日志。但是,时间戳的格式似乎导致它失败。我尝试了许多不同的格式,以匹配redshift声称支持的格式。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- This section contains the log4net configuration settings -->
<log4net>
<!-- Define some output appenders -->
<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
<immediateFlush value="true" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<appender name="RedshiftAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.Odbc.OdbcConnection,System.Data,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral" />
<connectionString value="Driver={Amazon Redshift (x86)};..." />
<commandText value="INSERT INTO hep_config.server_log (tm,src,lvl,msg) VALUES ($1,$2,$3,$4)" />
<parameter>
<parameterName value="$1" />
<dbType value="DateTime" />
<layout type="log4net.Layout.PatternLayout" value="%date{yyyyMMdd HH':'mm':'ss'.'fff}" />
</parameter>
<parameter>
<parameterName value="$2" />
<dbType value="String" />
<size value="128" />
<layout type="log4net.Layout.PatternLayout" value="%thread" />
</parameter>
<parameter>
<parameterName value="$3" />
<dbType value="String" />
<size value="64" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
<parameter>
<parameterName value="$4" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout" value="%message" />
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="DebugAppender" />
<appender-ref ref="RedshiftAppender" />
</root>
</log4net>
</configuration>
答案 0 :(得分:2)
我试过并且无法使用Redshift驱动程序。但是,PostgreSQL ODBC Driver确实有效。请尝试以下方法:
更改连接字符串以使用PostgreSQL ODBC Driver。注意我在64位窗口上,因此您需要根据您的版本调整驱动程序。
<connectionString value="Driver={PostgreSQL Unicode(x64)};..." />
更改DateTime的布局以使用RawUtcTimeStampLayout。
<layout type="log4net.Layout.RawUtcTimeStampLayout" />
<强>更新强>
我能够使用Redshift驱动程序。 OdbcCommand.Parameters状态的MSDN文档:
当CommandType设置为Text时,.NET Framework数据提供程序为 ODBC不支持将命名参数传递给SQL语句或 到OdbcCommand调用的存储过程。在其中任何一个 使用问号(?)占位符。
和
OdbcParameter对象添加到的顺序 OdbcParameterCollection必须直接对应于的位置 命令文本中参数的问号占位符。
使用此信息,您可以尝试以下操作:
<commandText value="INSERT INTO log.log_test(tm,src,lvl,msg) VALUES (?, ?, ?, ?)" />
此时,您对参数的命名无关紧要,因为参数的顺序很重要。我确实继续使用RawUtcTimeStampLayout,但我将dbType更改为string。
答案 1 :(得分:0)
您可以将时间戳格式定义为COPY命令的一部分。
使用以下标志:
TIMEFORMAT [AS] {'timeformat_string'| 'auto'| 'epochsecs'| 'epochmillisecs'}如果未指定TIMEFORMAT,则为默认格式 是YYYY-MM-DD HH:MI:SS。