Настраиваем Syslog сервер на MAC OS X (включая EI Capitan)
По умолчанию syslogd на MacOS X работает, но из сети логи не принимает и соответственно никуда не сохраняет.
Итак, задача: некоторые устройства, например сетевые маршрутизаторы посылают на сервер т.е. на наш Mac свои логи. Допустим они это делают с facility: local5 и severity: info. Нам нужно принять эти логи и сохранить их в отдельном файле, например, /var/log/routers.log
Если у Вас уже стоит EI Capitan, то прежде чем читать все нижесказанное нам сначала нужно отключить SIP "System Integrity Protection" - это фитча которая появилась в новой операционке и не позволяет редактировать системные файлы. Делается это так:
- Перезапускаем Mac в режиме Recovery (Нужно держать нажатыми кнопки <Cmd>+<R> пока на экране не появится лого)
- Из системного меню запускаем терминал Utility->Terminal
- вводим команду "csrutil disable"
- снова перезапускаем Mac и теперь мы снова сможем редактировать системные файлы как старых версиях операционок.
Когда у нас все заработает, SIP снова можно будет включить.
Теперь собственно приступаем к настройкам.
Сначала нам нужно научить syslogd создавать сокет и слушать UDP порт 514. Все соответствующие настройки syslogd хранятся в файле:
Сначала нам нужно научить syslogd создавать сокет и слушать UDP порт 514. Все соответствующие настройки syslogd хранятся в файле:
/System/Library/LaunchDaemons/com.apple.syslogd.plist
Обычно этот файл находится в бинарном виде и чтобы отредактировать его нужно предварительно конвертировать в XML. Делается это так:
sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.syslogd.plist
Теперь его можно редактировать:
sudo nano /System/Library/LaunchDaemons/com.apple.syslogd.plist
Man по syslogd говрит нам что в этот plist нужно добавить следующие строки в секцию Sockets
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
еще для порядка нужно добавить опцию -udp_in в строку запуска демона. Практика показывает что и без этого работает но лучше сделать все по man-у. В итоге этот файл должен выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnableTransactions</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>ASL_DISABLE</key>
<string>1</string>
</dict>
<key>HopefullyExitsLast</key>
<true/>
<key>JetsamProperties</key>
<dict>
<key>JetsamMemoryLimit</key>
<integer>300</integer>
<key>JetsamPriority</key>
<integer>-49</integer>
</dict>
<key>Label</key>
<string>com.apple.syslogd</string>
<key>MachServices</key>
<dict>
<key>com.apple.system.logger</key>
<dict>
<key>ResetAtClose</key>
<true/>
</dict>
</dict>
<key>OnDemand</key>
<false/>
<key>POSIXSpawnType</key>
<string>Interactive</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/syslogd</string>
<string>-udp_in</string>
</array>
<key>Sockets</key>
<dict>
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
<key>BSDSystemLogger</key>
<dict>
<key>SockPathMode</key>
<integer>438</integer>
<key>SockPathName</key>
<string>/var/run/syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>
Получившийся plist нужно конвертировать обратно в бинарный формат.
sudo plutil -convert binary1 /System/Library/LaunchDaemons/com.apple.syslogd.plist
Есть еще один интересный способ редактирования plist с помощью утилиты PlistBuddy. Выглядит он так:
sudo /usr/libexec/PlistBuddy /System/Library/LaunchDaemons/com.apple.syslogd.plist
add :ProgramArguments:1 String -udp_in
add :Sockets:NetworkListener dict
add :Sockets:NetworkListener:SockServiceName string syslog
add :Sockets:NetworkListener:SockType string dgram
save
quit
Теперь можно рестартовать демон и проверить что теперь он слушает порт 514
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo lsof -i:514
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 89u IPv4 0x7ea94d2d8fb451ad 0t0 UDP *:syslog
launchd 1 root 106u IPv6 0x7ea94d2d7c5cc395 0t0 UDP *:syslog
syslogd 4992 root 4u IPv4 0x7ea94d2d8fb451ad 0t0 UDP *:syslog
syslogd 4992 root 5u IPv6 0x7ea94d2d7c5cc395 0t0 UDP *:syslog
Это процесс в Mac OS, вопреки ожиданиям, управляется не файлом /etc/syslogd.conf а файлом /etc/asl.conf. Первый файл тоже работает но asl представляет больше возможностей. Так как мы в начале договорились что логи приходят как LOCAL5.INFO и должны складываться в файл /var/log/routers.log нам нужно в файл /etc/asl.conf добавить следующую строку
? [= Facility local5] [= Level info] file /var/log/routers.log mode=0644 format=bsd
и снова рестартовать демон.
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
Отныне логи должны складываться в указанный файл.