rsyslog: faça% syslogtag% length igual

3

Eu tenho rsyslog configurado para fazer o login no seguinte formato:

$template long-iso,"%$NOW% %timereported:8:15%  %syslogtag% %msg%\n"

que produz logs como este:

2013-12-14 15:59:39  postfix/pickup[4665]:  559A48C9: uid=0 from=<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

Como posso tornar o texto na terceira coluna igual, ou seja,

2013-12-14 15:59:39  postfix/pickup[4665]:   559A48C9: uid=0 from=<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
    
por Martin Vegter 14.12.2013 / 16:15

2 respostas

2

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.

    
por 14.12.2013 / 21:36
0

Não é possível produzir campos de largura fixa com o rsyslogd. O que é possível tu é campos separados por tabulações.

O seguinte deve ser utilizável. Ele também irá escrever o nome do processo e o PID em campos separados:

$template long-iso,"%$NOW%\t%timereported:8:15%\t%programname%\t%procid%\t%msg%\n"
    
por 19.09.2014 / 17:37