Usando o rsyslog
Eu encontrei esta página intitulada: Enviando mensagens com tags maiores que 32 caracteres . Dentro da página, notei que você pode especificar o que parece ser um intervalo para os campos dentro do modelo.
Exemplo
template (name="ForwardFormat" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME%
% syslogtag: 1: 32 %% msg ::: sp-if-no-1st-sp %% msg% ")
Talvez você possa tornar esse campo mais amplo do que qualquer coisa que seja exibida lá, forçando a saída a se alinhar?
Depois usando o awk
Você também pode fazer isso postmortem usando o seguinte usando awk
para controlar a largura dessa terceira coluna. Isso seria apenas para exibir o log quando você quiser revisá-lo, ele não corrigirá o problema que você está perguntando.
$ awk '{ printf("%s %s %-30s %s ", $1, $2, $3, $4); \
for (i = 5; i <= NF; i++) printf $i; print "" }' < rsyslog.txt
Exemplo
$ awk '{ printf("%s %s %-30s %s ", $1, $2, $3, $4); \
for (i = 5; i <= NF; i++) printf $i; print "" }' < rsyslog.txt
2013-12-14 15:59:39 postfix/pickup[4665]: 559A48C9: uid=0from=<root>
2013-12-14 15:59:39 postfix/cleanup[5194]: 559A48C9: message
2013-12-14 15:59:39 postfix/qmgr[7358]: 559A48C9: from=<[email protected]>
2013-12-14 15:59:39 postfix/smtp[5196]: 559A48C9: to=<[email protected]>
2013-12-14 15:59:39 postfix/qmgr[7358]: 559A48C9: removed
Extraindo apenas o nome do processo sem o PID
O OP fez a seguinte pergunta de acompanhamento em comentários.
And do you know, by the way, how I could get rid if the part with the process ID, i.e. [4665] ? So that I only have postfix/pickup left in the 3rd column.
Eu acredito que o seguinte método usado para extrair dados para inserção em um banco de dados MySQL pode ser adaptado para fazer o que você está pedindo. O tópico é intitulado: ProcessID vazio, PID no Syslogtag .
A peça importante está neste exemplo:
$template dbFormat,"insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag, ProcessID) values ('%msg%', %syslogfacility%, '%HOSTNAME%', %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end%', '%syslogtag:R,ERE,1,BLANK:\[([0-9]{1,5})\]--end%')",sql
Especificamente esses bits. Essas duas variáveis:
- SysLogTag
- ProcessID
Estão sendo preenchidos por esses formatadores:
-
'%syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end%'
-
'%syslogtag:R,ERE,1,BLANK:\[([0-9]{1,5})\]--end%'
Eu acredito que o primeiro está se livrando da porção PID da saída do syslogtag. Enquanto o segundo está se livrando da parte do nome do processo da string, e mantendo apenas as informações do PID.