2015-05-20 3 views
3

Я пытаюсь войти в мой сервер redshift с помощью встроенного adonetappender из log4net. Когда поле timestamp будет удалено, журнал будет успешно сохранен. Однако формат временной метки, по-видимому, вызывает ее. Я пробовал много разных форматов, которые соответствуют утверждениям красного смещения.log to redshift с помощью adonetappender log4net

<?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

Обновление описания вопроса, поскольку, как представляется, проблема связана с форматом метки времени. Когда я удаляю метку времени, журнал вставляется. –

+0

Вы уверены, что формат, который вы используете, является допустимой меткой времени для Redshift? Основываясь на примерах, представленных в документации, это не похоже на это. http://docs.aws.amazon.com/redshift/latest/dg/r_Date_and_time_literals.html – Garett

+0

хорошая точка! ... хотя даже когда я обновил это, он все равно дает мне ту же ошибку, а именно: «System.FormatException: String не был признан допустимым DateTime» ... изменен, чтобы показать правильный формат даты. –

ответ

2

Я пробовал и не мог заставить его работать с драйвером Redshift. Однако работает PostgreSQL ODBC Driver. Попробуйте следующее:

Измените строку подключения, чтобы использовать PostgreSQL ODBC Driver. Примечание. Я использую 64-битные окна, поэтому вам нужно будет настроить драйвер на основе вашей версии.

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

Измените свой макет для DateTime, чтобы использовать RawUtcTimeStampLayout.

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

Примечание:Timestamp значения в Redshift являются UTC

UPDATE

Я был в состоянии заставить его работать с драйвером Redshift. В документации MSDN для OdbcCommand.Parameters состояний:

Когда CommandType установлен в текст, .NET Framework Data Provider для ODBC не поддерживает прохождение именованных параметров в операторе SQL или хранимой процедуры, называемой помощью OdbcCommand. В любом из этих случаев используйте знак вопроса (?).

и

Порядок, в котором объекты OdbcParameter добавляются в OdbcParameterCollection должны напрямую соответствовать положению знак вопроса шаблонного параметра в тексте команды.

Используя эту информацию, вы можете попробовать следующее:

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

На данный момент это не имеет значения, что вы называете параметры, как порядок параметров материи. Я продолжал использовать RawUtcTimeStampLayout, но я изменил dbType на строку.

+0

, хотя это не совсем ответ, так как он использует другой драйвер, он близок, как кажется, я получу ... Мне нужно проверить поддержку красного смещения с помощью драйвера postgresql odbc ... если я не получу лучший ответ до конца щедрости Я награду его здесь –

+0

Спасибо за помощь! одно предостережение ... RawUtcTimeStampLayout, похоже, не записывает субсекунды! –

0

Вы можете определить формат временной метки как часть команды COPY.

Используйте следующий флаг:

TIMEFORMAT [AS] { 'timeformat_string' | «авто» | «эпохальные» | 'epochmillisecs'} Если значение TIMEFORMAT не указано, формат по умолчанию - ГГГГ-ММ-ДД ЧЧ: МИ: СС.

+0

извините ... Я никогда не исполняю команду копирования внутри своего кода, я полагаю, что ни один из них не является log4net, так как он использует подготовленный запрос ... Я не уверен, как это относится к вопросу вообще? –

+0

Рекомендуется копировать данные в Redshift, а не INSERT. Это позволяет значительно ускорить время проглатывания, и вы можете добавить еще много записей журнала, как это делается параллельно с COPY и серийно с INSERT. После того, как у вас есть файлы журнала, вы можете скопировать их на S3, а затем скопировать их в Redshift. – Guy

+0

, хотя я согласен с вами в отношении больших файлов (и да, мы делаем именно это при загрузке хранилища данных), это ведение журнала в реальном времени с помощью adonetappender из log4net ... то, что вы рекомендуете, просто не применяется. –

Смежные вопросы