
Файлы модулей systemd для моих приложений Java (в Ubuntu 18.04), похоже, работают — я настроил отправку stdout и stderr в syslog, и записи журнала появились в /var/log/syslog.
Однако я хочу использовать динамические имена, поэтому я добавил /etc/rsyslog.d/10-myapp.conf, содержащий:
$CreateDirs on
:programname, startswith, "myapp-" {
/var/log/apps/$programname.log
stop
}
Затем я перезапустил rsyslog... и получил файл с именем $programname.log в каталоге.
Я подозреваю, что проблема может быть в том, как я указал динамическое имя файла - я вижу, что в других местах люди используютдругой синтаксис для выборасообщение вместе с %...% вокруг имени переменной. Однако попытка сделать следующее (и перезапуск rsyslog) не помогла:
:programname, startswith, "myapp-" {
"/var/log/apps/%programname%.log"
stop
}
Это дало мне файл с именем %programname%.log
решение1
Чтобы использовать динамические имена файлов, вам нужно использовать шаблон. Он присваивает имя строке (обычно DynFile
в примерах) и интерполирует %property%
значения в строке при использовании. Чтобы использовать шаблон в устаревшем синтаксисе, вам нужно добавить к нему префикс ?
.Try
$template DynFile,"/var/log/apps/%programname%.log"
:programname, startswith, "myapp-" {
?DynFile
stop
}
Синтаксис non-legacy немного более явный и иногда может быть более читабельным. Вы на самом деле используете встроенныйомфайлмодуль. Осторожно,шаблоныимеют 2 различных применения: как динамические имена файлов и как формат для записи данных. Однако для простых строк они определяются таким же образом, например:
template(name="myfile" type="string"
string="/var/log/apps/%programname%.log")
if ($programname startswith "myapp-") then {
action(type="omfile" dynaFile="myfile")
stop
}
Ключевые слова, такие как, dynaFile
должны быть написаны точно. Обратите внимание, что action()
есть template=...
опция ключевого слова. То есть, чтобы предоставить шаблон для данных, записанных в файле.