Как настроить Loggly на эластичном бобовом стебле?
Я хотел бы настроить Loggly для запуска на AWS Elastic Beanstalk, но не могу найти никакой информации о том, как это сделать. Есть ли какое-нибудь руководство в любом месте или какое-то общее руководство по началу работы?
Ответы
Ответ 1
Вот как я это делаю, для papertrailapp.com(который я предпочитаю вместо loggly). В папке /ebextensions
(см. Дополнительную информацию) вы создаете logs.config
, где укажите:
container_commands:
01-set-correct-hostname:
command: hostname www.example.com
02-forward-rsyslog-to-papertrail:
# https://papertrailapp.com/systems/setup
command: echo "*.* @logs.papertrailapp.com:55555" >> /etc/rsyslog.conf
03-enable-remote-logging:
command: echo -e "\$ModLoad imudp\n\$UDPServerRun 514\n\$ModLoad imtcp\n\$InputTCPServerRun 514\n\$EscapeControlCharactersOnReceive off" >> /etc/rsyslog.conf
04-restart-syslog:
command: service rsyslog restart
55555
следует заменить номером порта UDP, предоставленным papertrailapp.com. Каждый раз после загрузки нового экземпляра этот конфиг будет применен. Затем в log4j.properties
:
log4j.rootLogger=WARN, SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.facility=local1
log4j.appender.SYSLOG.header=true
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=[%p] %t %c: %m%n
Я не уверен, является ли это оптимальным решением. Подробнее об этом механизме читайте в jcabi-beanstalk-maven-plugin
Ответ 2
Вы также можете использовать установку script из самого журнала.
Ниже приведена инструкция по устаревшей настройке https://www.loggly.com/docs/configure-syslog-script/ с незначительными изменениями (никаких подсказок подтверждения, команда sudo не заменена, поскольку нет tty)
(редактирование: обновленная ссылка, похоже, устаревшее решение теперь в loggly docs)
Поместите следующий script в .ebextensions/loggly.config
Замените TOKEN и ACCOUNT на свой собственный.
#
# Install loggly.com on AWS Elastic Beanstalk
# Tested with node.js environment
# Save this file as .ebextensions/loggly.config
# Deploy per normal scripts or aws.push. To help debug the push, ssh & tail /var/log/cfn-init.log
# See Also /var/log/eb-tools.log
#
commands:
01_loggly_dl:
command: wget -q -O /tmp/loggly.py https://www.loggly.com/install/configure-syslog.py
02_loggly_config:
command: su --session-command="python /tmp/loggly.py setup --auth TOKEN --account ACCOUNT --yes"
Ответ 3
Вот ссылка на сайт поддержки loggly для использования syslogd с loggly:
http://wiki.loggly.com/loggingconfiguration
или используя loggly api с вашим собственным приложением:
http://wiki.loggly.com/apidocumention
Ответ 4
Вот конфигурация эластичного спама для Loggly, которую я только начал использовать, благодаря указателям из этого потока и инструкциям по настройке поставщиков SaaS для ведения журнала. [Loggly Config Mgmt, Papertrail rsyslog]
Сохраните файл как loggly.config в каталоге .ebextensions и обязательно проверьте соглашения о форматировании YAML (без вкладок и т.д.). Замените номер порта Loggly TCP, имя пользователя, пароль и имя домена в угловых скобках по мере необходимости.
Обратите внимание, что для AWS рубиновых версий эластичного спая могут быть различия в настройке EC2/etc/rsyslog. Например, если /etc/rsyslog.d уже существует, и уже существует директива "$ IncludeConfig/etc/rsyslog.d/*.conf", тогда команда "01-forward-rsyslog-to-loggly:" может быть удалены.
Развертывание для обычных скриптов или aws.push. Чтобы отладить push, ssh и tail/var/log/cfn-init.log
files:
"/etc/rsyslog.d/90-loggly.conf" :
mode: "000664"
owner: root
group: root
content: |
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if host is down
*.* @@logs.loggly.com:<yourportnum> # !!!Loggly supplied port number for each app!!!
# ### end of the forwarding rule ###
encoding: plain
"/tmp/loggly.py" :
mode: "000755"
owner: root
group: root
content: |
import json
import sys
import urllib2
'''
Auto-authenticate Syslog TCP inputs.
Usage: python inputs.py -u user -p pass -s subdomain
'''
state = None
params = {}
for i in range(len(sys.argv)):
arg = sys.argv[i]
if state:
params[state] = arg
state = None
if arg == '--username' or arg == '-u':
state = 'username'
if arg == '--password' or arg == '-p':
state = 'password'
if arg == '--subdomain' or arg == '-s':
state = 'subdomain'
url = 'https://%s.loggly.com/api/inputs' % params['subdomain']
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, url, params['username'], params['password'])
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
opener.open(url)
urllib2.install_opener(opener)
inputs = json.loads(urllib2.urlopen(url).read())
for input in inputs:
if input['service']['name'] == 'syslogtcp':
url = 'https://%s.loggly.com/api/inputs/%d/adddevice' % \
(params['subdomain'], input['id'])
response = urllib2.urlopen(url, {}).read()
print response
encoding: plain
commands:
01-forward-rsyslog-to-loggly:
# http://loggly.com/support/sending-data/logging-from/syslog/rsyslog/cd
command: test "$(grep -s '90-loggly.conf' /etc/rsyslog.conf)" == "" && echo -e "\n# Include the loggly.conf file\n\$IncludeConfig /etc/rsyslog.d/90-loggly.conf" >> /etc/rsyslog.conf
02-restart-syslog:
command: service rsyslog restart
03-inform_loggly:
command: "python /tmp/loggly.py -u <Yourloginname> -p <Yourpassword> -s <Yourdomainname>"
Ответ 5
Как правило, у файла /etc/rsyslog.config в конце будет "$ IncludeConfig/etc/rsyslog.d/*.conf", поэтому вы можете просто ввести свой собственный файл конфигурации, используя часть "files:" вашего файл .ebextensions. Это работает независимо от того, развертываетесь ли вы на свежих серверах или нет.
Для ruby production.log у вас может быть что-то подобное в файле .ebextensions/01loggly.config. Обратите внимание, что это также берет имя среды beanstalk как тег loggly.
# For docs on eb configs, see http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
# This set of commands sets up loggly forwarding
files:
"/etc/rsyslog.d/myapp-loggly.conf" :
mode: "000664"
owner: root
group: root
content: |
$template LogglyFormat,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [[email protected] tag=`{ "Ref" : "AWSEBEnvironmentName" }`] %msg%\n"
*.* @@logs-01.loggly.com:514;LogglyFormat
# One time config
$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
$WorkDirectory /var/spool/rsyslog
# Add a tag for file events
# For production.log
$InputFileName /var/app/support/logs/production.log
$InputFileTag production-log
$InputFileStateFile stat-production-log #this must be unique for each file being polled
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
# Send to Loggly then discard
if $programname == 'myapp-production-log' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'myapp-production-log' then ~
encoding: plain
commands:
00-make-work-directory:
command: mkdir -p /var/spool/rsyslog
01-restart-syslog:
command: service rsyslog restart
Для Tomcat вы можете сделать что-то подобное в файле .ebextesions/01logglyg.config:
# For docs on eb configs, see http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
# This set of commands sets up loggly forwarding
files:
"/etc/rsyslog.d/mytomcatapp-loggly.conf" :
mode: "000664"
owner: root
group: root
content: |
$template LogglyFormat,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [[email protected] tag=`{ "Ref" : "AWSEBEnvironmentName" }`] %msg%\n"
*.* @@logs-01.loggly.com:514;LogglyFormat
# One time config
$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
$WorkDirectory /var/spool/rsyslog
# catalina.log
$InputFileName /var/log/tomcat7/catalina.log
$InputFileTag catalina-log
$InputFileStateFile stat-catalina-log
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'catalina-log' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'catalina-log' then ~
# catalina.out
$InputFileName /var/log/tomcat7/catalina.out
$InputFileTag catalina-out
$InputFileStateFile stat-catalina-out
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'catalina-out' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'catalina-out' then ~
# host-manager.log
$InputFileName /var/log/tomcat7/host-manager.log
$InputFileTag host-manager
$InputFileStateFile stat-host-manager
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'host-manager' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'host-manager' then ~
# initd.log
$InputFileName /var/log/tomcat7/initd.log
$InputFileTag initd
$InputFileStateFile stat-initd
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'initd' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'initd' then ~
# localhost.log
$InputFileName /var/log/tomcat7/localhost.log
$InputFileTag localhost-log
$InputFileStateFile stat-localhost-log
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'localhost-log' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'localhost-log' then ~
# manager.log
$InputFileName /var/log/tomcat7/manager.log
$InputFileTag manager
$InputFileStateFile stat-manager
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
if $programname == 'manager' then @@logs-01.loggly.com:514;LogglyFormat
if $programname == 'manager' then ~
encoding: plain
commands:
00-make-work-directory:
command: mkdir -p /var/spool/rsyslog
01-restart-syslog:
command: service rsyslog restart
Эта конфигурация работает для меня - хотя я еще не определил, как получить многострочные записи, входящие в одну запись в Loggly.
Ответ 6
Я знаю, что это вопрос довольно старый, но я обнаружил, что ответы действительно не отвечали на вопрос или просто не работали правильно, когда они были реализованы. Я обнаружил, что это работает (файл .ebextenstions/02loggly.config):
container_commands:
01-transform-rsyslog.conf:
command: sed "s/NODE_ENV/$NODE_ENV/g" scripts/22-loggly.conf.temp > scripts/22-loggly.conf
02-setup-rsyslog.conf:
command: cp scripts/22-loggly.conf /etc/rsyslog.d/22-loggly.conf
03-restart:
command: /sbin/service rsyslog restart
шаг "01-transform-rsyslog.conf" необязателен; Я использую это, чтобы установить тег NODE_ENV в файле. "22-loggly.conf.temp" - это модифицированная версия файла "22-loggly.conf", которая создается при "/etc/rsyslog.d/" при запуске установки источника Linux script (https://www.loggly.com/install/configure-syslog.py). Я только что установил его на экземпляр ec2 и скопировал файл.
Примечание. Мне пришлось добавить команду /sbin в мою служебную команду, потому что она не срабатывала для меня без нее. Кроме того, это перезапускает syslog при каждом развертывании, что должно быть хорошо.
Теперь вам нужно только следить за тем, чтобы ваши приложения регистрировались в syslog. Для Java это будет log4j или аналогичный. Для Node.js(это то, что я использую), работает rconsole (https://github.com/tblobaum/rconsole).
Ответ 7
Ни одна из вещей, которые я пробовал, по-видимому, не работает, и документальная документация очень запутанна!
Надеюсь, что это поможет кому-то, вот как я заработал.
Вставьте следующее в .ebextensions/loggly.config
files:
"/etc/rsyslog.conf" :
mode: "000644"
owner: root
group: root
content: |
$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
# Input for FILE.LOG
$InputFileName /var/app/current/PATH_TO_YOUR_LOG_FILE
$InputFileTag social_php:
$InputFileStateFile stat-social_php #this must be unique for each file being polled
$InputFileSeverity info
$InputRunFileMonitor
#Add a tag for events from this file
$template LogglyFormatsocial_php,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [[email protected] tag=\"php_log\"] %msg%\n"
if $programname == 'social_php' then @@logs.loggly.com:37146;LogglyFormatsocial_php
if $programname == 'social_php' then ~
*.* @@logs.loggly.com:37146
commands:
01-restart-syslog:
command: service rsyslog restart
- Замените все экземпляры social_php тегом, который имеет смысл для вашего приложения.
- Заменить /var/app/current/PATH _TO_YOUR_LOG_FILE с вашим местоположением файла журнала
Ответ 8
Следуйте моей конфигурации логарифма в эластичном шланге. Для Linux + log4j
в файле конфигурации .ebextensions
container_commands:
01_configure_sudo_access:
command: sed -i -- 's/ requiretty/ \!requiretty/g' /etc/sudoers
02_loggy_configure:
command: sudo python .ebextensions/scripts/loggly_config.py
03_restore_sudo_access:
command: sed -i -- 's/ \!requiretty/ requiretty/g' /etc/sudoers
Loggly script в python для AMI по умолчанию:
import os
rsyslog_path = '/etc/rsyslog.conf'
loggly_file_path = '/etc/rsyslog.d/22-loggly.conf'
class LogglyConfig:
def __init__(self):
self.__linux_log()
self.__config_loggly_for_log4j()
def __linux_log(self):
#not installed on this machine
if not os.path.exists(loggly_file_path):
os.system('rm -f configure-linux.sh')
os.system('wget https://www.loggly.com/install/configure-linux.sh')
os.system('sudo bash configure-linux.sh -a DOMAIN -t TOKEN -u USER -p PASSWORD -s')
def __config_loggly_for_log4j(self):
f = open(rsyslog_path,'r')
file_text = f.read()
f.close()
file_text = file_text.replace('#$ModLoad imudp', '$ModLoad imudp')
file_text = file_text.replace('#$UDPServerRun 514', '$UDPServerRun 514')
f = open(rsyslog_path,'w')
f.write(file_text)
f.close()
os.system('service rsyslog restart')
LogglyConfig()
В log4j.properties в вашем проекте java
log4j.rootLogger=INFO, SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.SyslogHost=localhost
log4j.appender.SYSLOG.Facility=Local3
log4j.appender.SYSLOG.Header=true
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=java %d{ISO8601} %p %t %c{1}.%M - %m%n