2015-07-07 3 views
3

Моя цель

У меня есть несколько различных контейнеров, работающих внутри хоста. Все они имеют общий объем с разъемом /dev/log друг друга. Хост пересылает эти журналы на центральный сервер протоколирования. Все остальные журналы контейнеров отображаются на хосте /var/log/messages. Другие контейнеры представляют собой программы на основе python, которые позволяют вести журнал напрямую присоединяться к сокету unix домена /dev/log.Приложение Java в контейнере Docker не регистрируется в syslog правильно

Базовая конфигурация

У меня есть Docker контейнер работает приложение SCALA из файла банку. Сокеты /dev/log совместно используются как тома между хостом и контейнером. Файл log4j.properties для приложения, кажется, хорошо для меня, и устанавливается следующим образом:

# Root logger option 
log4j.rootLogger=INFO, file, stdout, SYSLOG 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=log/associationRules.log 
log4j.appender.file.MaxFileSize=10MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c{1}:%L] %-5p <%X{jobID}> %m%n 

# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c{1}:%L] %-5p <%X{jobID}> %m%n 

# Log to syslog 
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSLOG.syslogHost=localhost 
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSLOG.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c{1}:%L] %-5p <%X{jobID}> %m%n 
log4j.appender.SYSLOG.Facility=LOCAL0 
log4j.appender.SYSLOG.Threshold=debug 
log4j.appender.SYSLOG.FacilityPrinting=true 

STDOUT и файлов журналов выполняются должным образом, но SYSLOG, кажется, не работает правильно. Журналы отображаются в контейнере /var/log/syslog, но они не отображаются на главном /var/log/messages. Я думал, что SyslogAppender также будет выводиться на /dev/log, но похоже, что это не так.

Дополнительная информация

Вот результат я получаю в контейнера /var/log/syslog. Я вижу некоторые проблемы с запуском imuxsock, но я не понимаю, как журналы хранятся на /var/log/syslog. Последние две строки из приложения и совместимы с STDOUT и файлов appenders

Jul 6 18:07:18 26056b722779 rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="25" x-info="http://www.rsyslog.com"] start 
Jul 6 18:07:18 26056b722779 rsyslogd: cannot create '/dev/log': Address already in use 
Jul 6 18:07:18 26056b722779 rsyslogd: imuxsock does not run because we could not aquire any socket 

Jul 6 18:07:18 26056b722779 rsyslogd-3000: activation of module imuxsock failed 
Jul 6 18:07:18 26056b722779 rsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted. 
Jul 6 18:07:18 26056b722779 rsyslogd-2145: activation of module imklog failed [try http://www.rsyslog.com/e/2145 ] 
Jul 6 18:07:19 localhost local0: 2015-07-06 18:07:19 [AssocApp$:112] INFO <Undefined> Listening to queue ASSOCIATIONRULES 
Jul 6 18:07:19 localhost local0: 2015-07-06 18:07:19 [AssocApp$:113] INFO <Undefined> Listening to queue ASSOCIATIONRULES 

базовое изображение контейнера является убунту 14,04 с Java установлен Мой CMD в dockerfile для изображения контейнера является:

CMD sudo service rsyslog start; java -cp /root/AssociationRules.jar AssocApp 

и я начинаю контейнер, как это:

docker run -d -v /dev/log:/dev/log <IMAGE> 

/etc/rsyslog.conf

################# 
#### MODULES #### 
################# 

$ModLoad imuxsock # provides support for local system logging 
$ModLoad imklog # provides kernel logging support 
#$ModLoad immark # provides --MARK-- message capability 

# provides UDP syslog reception 
#$ModLoad imudp 
#$UDPServerRun 514 

# provides TCP syslog reception 
#$ModLoad imtcp 
#$InputTCPServerRun 514 

# Enable non-kernel facility klog messages 
$KLogPermitNonKernelFacility on 

########################### 
#### GLOBAL DIRECTIVES #### 
########################### 

# 
# Use traditional timestamp format. 
# To enable high precision timestamps, comment out the following line. 
# 
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat 

# Filter duplicated messages 
$RepeatedMsgReduction on 

# 
# Set the default permissions for all log files. 
# 
$FileOwner syslog 
$FileGroup adm 
$FileCreateMode 0640 
$DirCreateMode 0755 
$Umask 0022 
#$PrivDropToUser syslog 
#$PrivDropToGroup syslog 

# 
# Where to place spool and state files 
# 
$WorkDirectory /var/spool/rsyslog 

# 
# Include all config files in /etc/rsyslog.d/ 
# 
$IncludeConfig /etc/rsyslog.d/*.conf 

$ModLoad imudp 
$UDPServerRun 514 

и /etc/rsyslog.d/50-default.conf

auth,authpriv.*     /var/log/auth.log                      
*.*;auth,authpriv.none   -/var/log/syslog                      
#cron.*       /var/log/cron.log                      
#daemon.*      -/var/log/daemon.log                     
kern.*       -/var/log/kern.log                     
#lpr.*       -/var/log/lpr.log                      
mail.*       -/var/log/mail.log                     
#user.*       -/var/log/user.log 

# 
# Logging for the mail system. Split it up so that 
# it is easy to write scripts to parse these files. 
# 
#mail.info      -/var/log/mail.info 
#mail.warn      -/var/log/mail.warn 
mail.err      /var/log/mail.err 

# 
# Logging for INN news system. 
# 
news.crit      /var/log/news/news.crit 
news.err      /var/log/news/news.err 
news.notice      -/var/log/news/news.notice 

# 
# Some "catch-all" log files. 
# 
#*.=debug;\ 
#  auth,authpriv.none;\ 
#  news.none;mail.none  -/var/log/debug 
#*.=info;*.=notice;*.=warn;\ 
#  auth,authpriv.none;\ 
#  cron,daemon.none;\ 
#  mail,news.none   -/var/log/messages 

# 
# Emergencies are sent to everybody logged in. 
# 
*.emerg        :omusrmsg:* 

# 
# I like to have messages displayed on the console, but only on a virtual 
# console I usually leave idle. 
# 
#daemon,mail.*;\ 
#  news.=crit;news.=err;news.=notice;\ 
#  *.=debug;*.=info;\ 
#  *.=notice;*.=warn  /dev/tty8 

# The named pipe /dev/xconsole is for the `xconsole' utility. To use it, 
# you must invoke `xconsole' with the `-file' option: 
# 
# $ xconsole -file /dev/xconsole [...] 
# 
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably 
#  busy site.. 
# 
daemon.*;mail.*;\ 
     news.err;\ 
     *.=debug;*.=info;\ 
     *.=notice;*.=warn  |/dev/xconsole 
+0

Я немного потерян; вы хотите войти в syslog контейнера или в syslog хоста? Это две разные вещи, выполненные несколько иначе. –

ответ

3

Мне кажется, ты overthinking это. Если я правильно прочитал ваш вопрос, вы хотите, чтобы контейнер Docker записывал его в системный журнал хост-компьютера.

Ошибка, о которой вы описали, вероятно, возникает из-за того, что вы запускаете второй демон syslog внутри вашего контейнера, который затем хочет открыть сокет /dev/log (который уже существует).

Несколько идей приходят на ум (все проверялось, хотя Enjoy с осторожностью.):

  1. Почему вы не настроить Log4j делать записи в демон удаленного системного журнала непосредственно? Это устранило бы необходимость в демонах syslog внутри контейнера и необходимость монтировать /dev/log в контейнер?

    # Log to syslog 
    log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender 
    log4j.appender.SYSLOG.syslogHost=<your-host-ip> # <-- INSERT HOST IP HERE 
    log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout 
    

    Чтобы сохранить контейнер портативный, лучше всего настроить IP-адрес системного журнала сервера на создание контейнера с помощью --add-host флаг:

    docker run -d --add-host sysloghost:<host-ip-here> <IMAGE> 
    

    Таким образом, вы можете просто использовать sysloghost в качестве имени хоста ваш файл конфигурации Log4J.

  2. Если вы настойчивы о запуске системного журнала сервера внутри контейнера приложения, вы должны быть в состоянии (помните: все непроверенные), чтобы настроить его, чтобы передать все сообщения на удаленный сервер системного журнала (где-то в /etc/rsyslog.conf или /etc/rsyslog.d) :

    *.* @sysloghost:512 # UDP forwarding 
    # *.* @@sysloghost:512 # TCP forwarding 
    
  3. еще лучше, почему бы не запустить демон системного журнала в его собственном контейнере Докер и связать этот контейнер в контейнерах приложений?

Имейте в виду, что для обоих решений, ваш системный журнал демона на вашем хосте должен быть настроен на прослушивание TCP или UDP сокет [ref]:

$ModLoad imudp 
$UDPServerRun 514 

В качестве альтернативы [ref]:

$ModLoad imtcp # needs to be done just once 
$InputTCPMaxSessions 500 
$InputTCPServerRun 514 
+0

Спасибо за ответ. Изменение поля syslogHost в log4j.properties не совсем работает. Он работает, когда я запускаю приложение локально на своей машине, когда он не находится в контейнере, но не тогда, когда я запускаю его в контейнере. Эта команда также работает, как ожидалось, на моей локальной машине, но не внутри контейнера. logger -d -n "Журнал испытаний. Это должно появиться на хосте docker" Должно быть что-то, что я могу настроить со стороны контейнера, но я в тупике. –

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

  • Нет связанных вопросов^_^