I can't help you with the date format, but I think there were some changes in a recent 7.5 release related to supporting timezone conversions.

logs received from remote machines have the timestamp provided by the remote machine, but the template setting should let you change the format.

as far as accessing the mmnormalize variables, they are $!name, so with your rule:

rule=: %vhost:word% %ip:word% %rlogname:word% %ruser:word% [%date:word% %heure:word% %tz:char-to:]%] "%method:word% %url:word% %pver:char-to:"%" %status:word% %bytesend:word% %referer:word% %useragent:quoted-string% %ssl:word% %sslport:word% %sslproto:word%

you would use $!vhost $!ip $!rlogname etc in a string template, or in a template where you are using properties explicitly (like http-error) you would use !vhost !ip !rlogname

David Lang

On Sun, 24 Nov 2013, Eric Renfro wrote:

Hello,

I'm trying to get rsyslog parsing out my Apache access logs and store them into 
ElasticSearch in a usable format that can work with logstash as well.

First, here's a code snipped of my recipient rsyslog configuration which 
details out how it's handling apache access logs already:

rsyslog.conf snippet:

template(name="RemoteHost" type="string" 
string="/srv/log/%HOSTNAME%/%$YEAR%/%$MONTH%/syslog-%$DAY%.log")

ruleset(name="remote") {
   $IncludeConfig /etc/rsyslog.d/*.remote

   action(type="omfile" DynaFile="RemoteHost")
}

input(type="imudp" port="514" ruleset="remote")
input(type="imtcp" port="514" ruleset="remote")



webservers.template: (imported globally):

template(name="httpd-access" type="list") {
   property(name="msg" position.from="2" spifno1stsp="off")
   property(name="msg" droplastlf="on")
   constant(value="\n")
}
template(name="httpd-error" type="list") {
   constant(value="<")
   property(name="syslogpriority-text")
   constant(value="> ")
   property(name="timestamp" dateFormat="rfc3339")
   constant(value=" ")
   property(name="hostname")
   constant(value=" ")
   property(name="syslogtag" position.from="1" position.to="32")
   property(name="msg" spifno1stsp="off")
   property(name="msg" droplastlf="on")
   constant(value="\n")
}

template(name="WebErrFiles" type="string" 
string="/srv/log/WEB/%$YEAR%/%$MONTH%/httpd_error-%$DAY%.log")
template(name="PhpErrFiles" type="string" 
string="/srv/log/WEB/%$YEAR%/%$MONTH%/php_error-%$DAY%.log")
template(name="WebFiles" type="string" 
string="/srv/log/WEB/%$YEAR%/%$MONTH%/access_%$!vhost%-%$DAY%.log")



logstash.template: (also imported globally):

template(name="logstash"
        type="list"
        option.json="on") {
          constant(value="{")
            constant(value="\"@timestamp\":\"")     property(name="timereported" 
dateFormat="rfc3339")
            constant(value="\",\"message\":\"")     property(name="msg")
            constant(value="\",\"host\":\"")        property(name="hostname")
            constant(value="\",\"severity\":\"")    
property(name="syslogseverity-text")
            constant(value="\",\"facility\":\"")    
property(name="syslogfacility-text")
            constant(value="\",\"syslogtag\":\"")   property(name="syslogtag")
          constant(value="\"}")
        }

template(name="httpd-access-logstash"
        type="list"
        option.json="on") {
          constant(value="{")
            #constant(value="\"@timestamp\":\"")        property(name="timereported" 
dateFormat="rfc3339")
            constant(value="\"@timestamp\":\"")         property(name="timereported" 
dateFormat="rfc3339")
            constant(value="\"@fields.bytes\":\"")      
property(name="$!bytesend")
            constant(value="\"@fields.clientip\":\"")   property(name="$!ip")
            #constant(value="\"@fields.duration\":\"")   property(name="$!...")
            constant(value="\"@fields.method\":\"")     
property(name="$!method")
            constant(value="\"@fields.request\":\"")    property(name="$!url")
            #constant(value="\"@fields.urlpath\":\"")    property(name="$!url")
            #constant(value="\"@fields.urlquery\":\"")   property(name="...")
            constant(value="\"@message\":\"")           property(name="msg" 
position.from="2" spifno1stsp="off")
            constant(value="\"@source_host\":\"")       
property(name="hostname")
            constant(value="\"@vhost\":\"")             property(name="$!vhost")
          constant(value="\"}")
        }



apacheaccess.rule: (used in following configuration):

rule=: %vhost:word% %ip:word% %rlogname:word% %ruser:word% [%date:word% %heure:word% %tz:char-to:]%] "%method:word% %url:word% %pver:char-to:"%" %status:word% %bytesend:word% %referer:word% %useragent:quoted-string% %ssl:word% %sslport:word% %sslproto:word%



10-apacheaccess.remote: (as imported from the rsyslog.conf):

if $programname == 'httpd' or $programname == 'php' then {
   #if $syslogseverity-text == 'error' then {
   if $programname == 'php' then {
       action(type="omfile" DynaFile="PhpErrFiles" template="httpd-error")
   } else if $syslogfacility-text == 'local1' then {
       action(type="omfile" DynaFile="WebErrFiles" template="httpd-error")
       #action(type="omfwd" Target="172.17.51.4" Port="514" Protocol="tcp")
   } else {
       action(type="mmnormalize" userawmsg="off" 
rulebase="/etc/rsyslog.d/apacheaccess.rule")
       action(type="omfile" DynaFile="WebFiles" template="httpd-access")
       action(type="omelasticsearch"
              server="localhost"
              serverport="9200"
              template="httpd-access-logstash"
              searchIndex="system"
              searchType="apache-access"
              bulkmode="on"
              queue.type="linkedlist"
              queue.size="5000"
              queue.dequeuebatchsize="300"
              action.resumeretrycount="-1")
       #action(type="omfwd" Target="172.17.51.4" Port="514" Protocol="tcp")
   }
   stop
}



90-logstash.remote:
*.* action(type="omelasticsearch"
          server="localhost"
          serverport="9200"
          template="logstash"
          searchIndex="system"
          searchType="syslog"
          bulkmode="on"
          queue.type="linkedlist"
          queue.size="5000"
          queue.dequeuebatchsize="300"
          action.resumeretrycount="-1")



What is working with all of this so far is the fact the rsyslog server receives 
Apache access logs from two different webservers in a load-balanced cluster, 
and it stores the logs into /srv/log/WEB/$year/$month/access_$!vhost.log 
successfully. Also, the catch-all rule in 90 is sending all local and remote 
syslog events to elasticsearch and that data is quite usable as-is so far.

The problem is with configuration 10 and its template. I'm trying to extract 
the portions of the apache access log and store them directly into the 
elasticsearch accordingly. So far, my problem is, I'm not getting /anything/ in 
elasticsearch for this right now, and I'm wondering why. I looked all over the 
rsyslog website to try to figure out how to use mmnormalize variables in 
template property() sections, but I see nothing so I can only guess, and I'm 
probably guessing wrong.


Secondly... Logstash uses ISO-8601 date format, which is very specific. I see 
on rsyslog's features that ISO-9601 is supported, but I see now way to actually 
have it utilize that at all.. My example case is in the following three date 
variations, 2 of which I've seen coming into rsyslog which oddly differs 
whether it's forwarded by tcp or local:

2013-11-23T13:14:00.818Z   ISO-8601                  -- desired format
2013-11-23T08:19:01-05:00  RFC-3339                  -- from forward
2013-11-23T08:20:01.392547-05:00  RFC-3339 also?  -- from log

It is notibly odd that tcp-forwarded syslog events only have date, time, 
timezone offset, no microseconds, and no Z. It is also notible that none of 
them have the Z, and they all have the timezone offset, which means that are 
not ISO-8601, but RFC-3339 specifically, which is a variation of ISO-8601 with 
localization to the native timezone, basically.


So, how can I fix all these issues?   I would appreciate the help in this.

Eric Renfro
Linux-Help.org System Engineer
_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to