使用log4net的adonetappender登录到redshift

时间:2015-05-20 20:27:42

标签: .net log4net amazon-redshift

我正在尝试使用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>

2 个答案:

答案 0 :(得分:2)

我试过并且无法使用Redshift驱动程序。但是,PostgreSQL ODBC Driver确实有效。请尝试以下方法:

更改连接字符串以使用PostgreSQL ODBC Driver。注意我在64位窗口上,因此您需要根据您的版本调整驱动程序。

<connectionString value="Driver={PostgreSQL Unicode(x64)};..." />

更改DateTime的布局以使用RawUtcTimeStampLayout。

<layout type="log4net.Layout.RawUtcTimeStampLayout" />

注意:Redshift中的 Timestamp值为UTC

<强>更新

我能够使用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。

相关问题