92_rsyslog.pm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. ##############################################
  2. # $Id: 92_rsyslog.pm 11101 2016-03-20 15:00:59Z betateilchen $
  3. package main;
  4. use strict;
  5. use warnings;
  6. use Sys::Syslog; # apt-get install libsys-syslog-perl
  7. #####################################
  8. sub rsyslog_Initialize($) {
  9. my ($hash) = @_;
  10. $hash->{DefFn} = "rsyslog_Define";
  11. $hash->{UndefFn} = "rsyslog_Undef";
  12. $hash->{DeleteFn} = "rsyslog_Undef";
  13. $hash->{NotifyFn} = "rsyslog_Log";
  14. no warnings 'qw';
  15. my @attrList = qw(
  16. disable:0,1
  17. disabledForIntervals
  18. rsl_timestamp:0,1
  19. );
  20. use warnings 'qw';
  21. $hash->{AttrList} = join(" ", @attrList);
  22. }
  23. #####################################
  24. sub rsyslog_Define($@) {
  25. my ($hash, $def) = @_;
  26. my @a = split("[ \t][ \t]*", $def);
  27. return "You must not define more than one rsyslog device!" if int(devspec2array('TYPE=rsyslog')) > 1;
  28. return "wrong syntax: define <name> rsyslog <ident> <logopt> <facility> <regexp>"
  29. if(int(@a) != 6);
  30. return "Bad regexp: starting with *" if($a[5] =~ m/^\*/);
  31. eval { "Hallo" =~ m/^$a[5]$/ };
  32. return "Bad regexp: $@" if($@);
  33. openlog($a[2],$a[3],$a[4]);
  34. $hash->{REGEXP} = $a[5];
  35. $hash->{STATE} = "active";
  36. # notifyRegexpChanged($hash, $a[5]);
  37. return undef;
  38. }
  39. sub rsyslog_Undef($$) {
  40. closelog();
  41. return undef;
  42. }
  43. sub rsyslog_Log($$) {
  44. my ($log, $dev) = @_;
  45. my $ln = $log->{NAME};
  46. return if(IsDisabled($ln));
  47. my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
  48. return if(!$events);
  49. my $n = $dev->{NAME};
  50. my $re = $log->{REGEXP};
  51. my $max = int(@{$events});
  52. my $tn = $dev->{NTFY_TRIGGERTIME};
  53. my $ct = $dev->{CHANGETIME};
  54. for (my $i = 0; $i < $max; $i++) {
  55. my $s = $events->[$i];
  56. $s = "" if(!defined($s));
  57. my $t = (($ct && $ct->[$i]) ? $ct->[$i] : $tn);
  58. if($n =~ m/^$re$/ || "$n:$s" =~ m/^$re$/ || "$t:$n:$s" =~ m/^$re$/) {
  59. $t =~ s/ /_/;
  60. my $output = "$n: $s";
  61. $output = "$t $output" if AttrVal($ln,'rsl_timestamp',0);
  62. syslog("info",$output) if defined &syslog;
  63. }
  64. }
  65. return "";
  66. }
  67. 1;
  68. =pod
  69. =item helper
  70. =begin html
  71. <a name="rsyslog"></a>
  72. <h3>rsyslog</h3>
  73. <ul>
  74. Log fhem events to local syslog instance.<br/>
  75. <br/>
  76. <b>Prerequisits</b>
  77. <ul>
  78. <br/>
  79. Additional perl module Sys::Syslog must be installed on your system. Install this package from cpan or <br/>
  80. by <code>apt-get install libsys-syslog-perl</code> (only on Debian based installations)<br/>
  81. </ul>
  82. <br/>
  83. <a name="rsyslogdefine"></a>
  84. <b>Define</b>
  85. <ul>
  86. <br/>
  87. <code>define &lt;name&gt; rsyslog &lt;ident&gt; &lt;logopt&gt; &lt;facility&gt; &lt;regexp&gt;</code><br/>
  88. <br/>
  89. Detailed descriptions of parameters ident, logopt, facility can be found on <a href="http://perldoc.perl.org/Sys/Syslog.html">perldoc</a><br/>
  90. <br/>
  91. Example to log anything:<br/>
  92. <br/>
  93. <code>define rsl rsyslog fhem ndelay local0 .* </code><br/>
  94. <br/>
  95. will produce output like:<br/>
  96. <pre>Mar 20 15:25:22 fhem-vm-8 fhem: global: SAVE
  97. Mar 20 15:25:44 fhem-vm-8 fhem: global: SHUTDOWN
  98. Mar 20 15:25:57 fhem-vm-8 fhem: global: INITIALIZED
  99. Mar 20 15:26:05 fhem-vm-8 fhem: PegelCux: Niedrigwasser-1: 20.03.2016 18:03
  100. Mar 20 15:26:05 fhem-vm-8 fhem: PegelCux: Hochwasser-1: 20.03.2016 23:45</pre>
  101. </ul>
  102. <br/>
  103. <a name="rsyslogattr"></a>
  104. <b>Attributes</b>
  105. <ul>
  106. <br/>
  107. <a name="rsl_timestamp"></a>
  108. <li><code>rsl_timestamp</code><br>
  109. <br/>
  110. If set to 1, fhem timestamps will be looged, too.<br/>
  111. Default behavior is to not log these timestamps, because syslog uses own timestamps.<br/>
  112. Maybe useful if mseclog is activated in fhem.<br/>
  113. <br/>
  114. Example output:<br/>
  115. <pre>Mar 20 15:47:42 fhem-vm-8 fhem: 2016-03-20_15:47:42 global: SAVE
  116. Mar 20 15:47:46 fhem-vm-8 fhem: 2016-03-20_15:47:46 global: SHUTDOWN
  117. Mar 20 15:47:53 fhem-vm-8 fhem: 2016-03-20_15:47:53 global: INITIALIZED</pre>
  118. </li><br>
  119. </ul>
  120. <br/>
  121. </ul>
  122. =end html