使用 log4net 的 adonetappender 登录到 redshift

log to redshift using log4net's adonetappender

我正在尝试使用 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 (,,,)" />
  <parameter>
    <parameterName value="" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.PatternLayout" value="%date{yyyyMMdd HH':'mm':'ss'.'fff}" />
  </parameter>
  <parameter>
    <parameterName value="" />
    <dbType value="String" />
    <size value="128" />
    <layout type="log4net.Layout.PatternLayout" value="%thread" />
  </parameter>
  <parameter>
    <parameterName value="" />
    <dbType value="String" />
    <size value="64" />
    <layout type="log4net.Layout.PatternLayout" value="%level" />
  </parameter>
  <parameter>
    <parameterName value="" />
    <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>

您可以将时间戳格式定义为 COPY 命令的一部分。

使用以下标志:

TIMEFORMAT [AS] {'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs' } If no TIMEFORMAT is specified, the default format is YYYY-MM-DD HH:MI:SS.

我试过但无法让它与 Redshift 驱动程序一起工作。但是,PostgreSQL ODBC Driver 确实有效。请尝试以下操作:

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

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

更改 DateTime 的布局以使用 RawUtcTimeStampLayout。

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

注意: Timestamp values in Redshift are UTC

更新

我能够让它与 Redshift 驱动程序一起工作。 OdbcCommand.Parameters 的 MSDN 文档指出:

When CommandType is set to Text, the .NET Framework Data Provider for ODBC does not support passing named parameters to an SQL statement or to a stored procedure called by an OdbcCommand. In either of these cases, use the question mark (?) placeholder.

The order in which OdbcParameter objects are added to the OdbcParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.

使用此信息,您可以尝试以下操作:

<commandText value="INSERT INTO log.log_test(tm,src,lvl,msg) VALUES (?, ?, ?, ?)" />

此时命名参数并不重要,因为参数的顺序很重要。我确实继续使用 RawUtcTimeStampLayout,但我将 dbType 更改为字符串。