From Fedora Project Wiki
Line 7: Line 7:
If your package requires regularly scheduled tasks to operate properly and does not ship systemd unit file, you can use those files to set that up.
If your package requires regularly scheduled tasks to operate properly and does not ship systemd unit file, you can use those files to set that up.


== Log Files on the filesystem ==
== Cron Job Files on the filesystem ==


Packages with log files must reside in their own directory under /var/log which must be named /var/log/$package_name
Packages with cron job files must be placed respectfully into one or more of the following directories /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly depending on the intended interval they should run.
 
Each log file in that directory must end with .log filename.
 
Each package that ships log file(s) must also ship a logrotation file that rotates the log file(s).


== Logrotate file ==
== Logrotate file ==

Revision as of 20:36, 19 March 2013

Fedora Cron Job Files

This document describes the guidelines for packaging cron job file(s), in Fedora.

For the purposes of these guidelines, a cron job file is defined as an script (e.g., shell scripts or Perl scripts) that is placed respectfully into one or more of the following directories /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly.

If your package requires regularly scheduled tasks to operate properly and does not ship systemd unit file, you can use those files to set that up.

Cron Job Files on the filesystem

Packages with cron job files must be placed respectfully into one or more of the following directories /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly depending on the intended interval they should run.

Logrotate file

If a package contains a logfile then it needs to also include a properly installed logrotate file.

Each logrotate file must end with the filename .conf. It must be placed /etc/logrotate.d/ and must have 0644 filepermission and be owned by root.

Here are examples of an logrotate file.

Example minimal logrotate file

/var/log/example/*log {
	missingok		# If the log file is missing, go on to the next one without issuing an error message
	notifempty		# Don't do any rotation if the logfile is empty
	compress		# Compress older files with gzip
	delaycompress		# Don't compress yesterdays files
}

Example minimal logrotate log file with user create mode

/var/log/example/*log {
	missingok		# If the log file is missing, go on to the next one without issuing an error message
	notifempty		# Don't do any rotation if the logfile is empty
	compress		# Compress older files with gzip
  	delaycompress		# Don't compress yesterdays files
	create 640 owner group  # Set create mode immediately after rotation
}

Example minimal logrotate file with daemon restart

/var/log/example/*log {
	missingok		# If the log file is missing, go on to the next one without issuing an error message
	notifempty		# Don't do any rotation if the logfile is empty
	compress		# Compress older files with gzip
  	delaycompress		# Don't compress yesterdays files
	sharedscripts		# Scripts are only run once for all files in directory
	postrotate
		/usr/bin/systemctl restart example.service 2>/dev/null || true
	endscript
}

Example minimal logrotate file with user create mode and daemon restart

/var/log/example/*log {
	missingok		# If the log file is missing, go on to the next one without issuing an error message
	notifempty		# Don't do any rotation if the logfile is empty
	compress		# Compress older files with gzip
  	delaycompress		# Don't compress yesterdays files
	create 640 owner group  # Set create mode immediately after rotation
	sharedscripts		# Scripts are only run once for all files in directory
	postrotate
		/usr/bin/systemctl restart example.service 2>/dev/null || true
	endscript
}
Debugging logrotate file
You can debug your logrotate file by running
# logrotate -d -f /etc/logrotate.d/example.conf
from the command line.


Rsyslog file

If package wants to use rsyslog as an additional optional syslog solution it also needs to contain an rsyslog conf file.

Each rsyslog file must end with the filename .conf. It must be placed /etc/rsyslog.d/ directory and must have 0644 filepermission and be owned by root.

Here is an examples of rsyslog file.

Example minimal rsyslog file

# Log example generated log messages to file
:syslogtag, isequal, "[EXAMPLE]" /var/log/example/example.log

& ~
Debugging rsyslog file
You can debug your ryslog file by running
# rsyslogd -f /etc/rsyslog.d/example.conf -N1
from the command line.

Log Files Packaging

If an package is going to provide additional optional syslog support then they must be placed into a separate $name-<syslogging option> subpackage as in $name-rsyslog or $name-syslog-ng

Example of rsyslog subpackage

Name:
.....
Source1: %{name}.logrotate

%package example-rsyslog
Summary:  Rsyslog support for %{name}
Group:    System Environment/Base
Requires: %{name} = %{version}-%{release}
Requires: logrotate
Requires: rsyslog

%description example-rsyslog
Rsyslog support for %{name}

%install 
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{name}
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
%{__install} -p -D -m 0700 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name}.conf

%files example-rsyslog
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}.conf
%dir %attr(0700,root,root) %{_localstatedir}/log/%{name}

Example of rsyslog subpackage with additional rsyslog file

Name:
.....
Source1: %{name}.logrotate
Source2: %{name}.rsyslog

%package example-rsyslog
Summary:  Rsyslog support for %{name}
Group:    System Environment/Base
Requires: %{name} = %{version}-%{release}
Requires: logrotate
Requires: rsyslog

%description example-rsyslog
Rsyslog support for %{name}

%install
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{name}
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rsyslog.d
%{__install} -p -D -m 0700 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name}.conf
%{__install} -p -D -m 0700 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/rsyslog.d/%{name}.conf

%files example-rsyslog
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}.conf
%config(noreplace) %{_sysconfdir}/rsyslog.d/%{name}.conf
%dir %attr(0700,root,root) %{_localstatedir}/log/%{name}

Example of syslog-ng subpackage

Name:
.....
Source1: %{name}.logrotate

%package example-syslog-ng
Summary:  Syslog-ng support for %{name}
Group:    System Environment/Base
Requires: %{name} = %{version}-%{release}
Requires: logrotate
Requires: syslog-ng

%description example-syslog-ng
Syslog-ng support for %{name}

%install
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{name}
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
%{__install} -p -D -m 0700 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name}.conf

%files example-syslog-ng
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}.conf
%dir %attr(0700,root,root) %{_localstatedir}/log/%{name}