Как настроить 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"

Ответ 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