使用 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 更改为字符串。
我正在尝试使用 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 更改为字符串。