[Kimchi-devel] [PATCH v4][Wok] Rotate wok logs

Aline Manera alinefm at linux.vnet.ibm.com
Mon Jan 25 17:04:47 UTC 2016


I am getting the following error when starting up Wok with this patch:

Traceback (most recent call last):
   File "src/wokd", line 97, in <module>
     sys.exit(main(sys.argv[1:]))
   File "src/wokd", line 94, in main
     wok.server.main(options)
   File "/home/alinefm/wok/src/wok/server.py", line 216, in main
     srv = Server(options)
   File "/home/alinefm/wok/src/wok/server.py", line 120, in __init__
     with open(os.path.join(paths.logrotate_dir, "wokd.in")) as template:
AttributeError: 'Paths' object has no attribute 'logrotate_dir'

I think it is because there is no logrotate_dir when running from source.

On 01/25/2016 11:52 AM, Ramon Medeiros wrote:
> Use logrotate to compress and keep 10 logs of 10MB
>
> Signed-off-by: Ramon Medeiros <ramonn at linux.vnet.ibm.com>
> ---
> Changes:
>
> v4:
> Add wokd.in file at logrotate, adding the logic to change the logging dir if
> it has been changed at wok.conf
>
> v3:
> Set log size to 10MB
> Use WatchedFileHandler to avoid issues with python logging and logrotate
>
> v2:
> Add logrotate as dependency
> Fix typo in Copyright
>
>   Makefile.am                |  2 ++
>   contrib/DEBIAN/control.in  |  1 +
>   contrib/Makefile.am        |  1 +
>   contrib/wok.spec.fedora.in |  2 ++
>   contrib/wok.spec.suse.in   |  2 ++
>   contrib/wokd.logrotate.in  | 28 ++++++++++++++++++++++++++++
>   src/wok/config.py.in       |  2 ++
>   src/wok/server.py          | 29 ++++++++++++++++++++---------
>   8 files changed, 58 insertions(+), 9 deletions(-)
>   create mode 100644 contrib/wokd.logrotate.in
>
> diff --git a/Makefile.am b/Makefile.am
> index 278bda1..fb4db2c 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -140,6 +140,8 @@ install-data-local:
>   	mkdir -p $(DESTDIR)/etc/wok/
>   	$(INSTALL_DATA) src/dhparams.pem $(DESTDIR)/etc/wok/dhparams.pem
>   	touch $(DESTDIR)/etc/nginx/conf.d/wok.conf
> +	mkdir -p $(DESTDIR)/etc/logrotate.d/
> +	$(INSTALL_DATA) $(top_srcdir)/contrib/wokd.logrotate.in $(DESTDIR)/etc/logrotate.d/wokd.in
>
>   uninstall-local:
>   	@if test -f $(systemdsystemunitdir)/wokd.service; then \
> diff --git a/contrib/DEBIAN/control.in b/contrib/DEBIAN/control.in
> index 1f39ad8..e585080 100644
> --- a/contrib/DEBIAN/control.in
> +++ b/contrib/DEBIAN/control.in
> @@ -14,6 +14,7 @@ Depends: python-cherrypy3 (>= 3.2.0),
>            python-ldap,
>            python-psutil (>= 0.6.0),
>            fonts-font-awesome,
> +         logrotate,
>            texlive-fonts-extra
>   Build-Depends: xsltproc,
>                  gettext,
> diff --git a/contrib/Makefile.am b/contrib/Makefile.am
> index ed4a006..036ec50 100644
> --- a/contrib/Makefile.am
> +++ b/contrib/Makefile.am
> @@ -29,6 +29,7 @@ EXTRA_DIST = \
>   	wokd-upstart.conf.debian \
>   	wokd-upstart.conf.fedora \
>   	make-deb.sh.in \
> +	wokd.logrotate.in \
>   	$(NULL)
>
>   make-deb.sh: make-deb.sh.in $(top_builddir)/config.status
> diff --git a/contrib/wok.spec.fedora.in b/contrib/wok.spec.fedora.in
> index 34b3ac3..612932d 100644
> --- a/contrib/wok.spec.fedora.in
> +++ b/contrib/wok.spec.fedora.in
> @@ -19,6 +19,7 @@ Requires:	python-ldap
>   Requires:	python-psutil >= 0.6.0
>   Requires:	fontawesome-fonts
>   Requires:	open-sans-fonts
> +Requires:   logrotate
>   BuildRequires:	gettext-devel
>   BuildRequires:	libxslt
>   BuildRequires:	openssl
> @@ -116,6 +117,7 @@ rm -rf $RPM_BUILD_ROOT
>   %{_sysconfdir}/nginx/conf.d/wok.conf.in
>   %{_sysconfdir}/wok/wok.conf
>   %{_sysconfdir}/wok/
> +%{_sysconfdir}/logrotate.d/wokd.in
>   %{_mandir}/man8/wokd.8.gz
>
>   %if 0%{?with_systemd}
> diff --git a/contrib/wok.spec.suse.in b/contrib/wok.spec.suse.in
> index 7fa660b..66c474b 100644
> --- a/contrib/wok.spec.suse.in
> +++ b/contrib/wok.spec.suse.in
> @@ -20,6 +20,7 @@ Requires:	nginx
>   Requires:	python-psutil >= 0.6.0
>   Requires:	fontawesome-fonts
>   Requires:	google-opensans-fonts
> +Requires:   logrotate
>   BuildRequires:	gettext-tools
>   BuildRequires:	libxslt-tools
>   BuildRequires:	openssl
> @@ -94,6 +95,7 @@ rm -rf $RPM_BUILD_ROOT
>   %{_sysconfdir}/wok/
>   %{_sysconfdir}/nginx/conf.d/wok.conf.in
>   %{_sysconfdir}/nginx/conf.d/wok.conf
> +%{_sysconfdir}/logrotate.d/wokd.in
>   %{_var}/lib/wok/
>   %{_localstatedir}/log/wok/*
>   %{_localstatedir}/log/wok/
> diff --git a/contrib/wokd.logrotate.in b/contrib/wokd.logrotate.in
> new file mode 100644
> index 0000000..969167d
> --- /dev/null
> +++ b/contrib/wokd.logrotate.in
> @@ -0,0 +1,28 @@
> +#
> +# Project Wok
> +#
> +# Copyright IBM Corp, 2016
> +#
> +# This library is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU Lesser General Public
> +# License as published by the Free Software Foundation; either
> +# version 2.1 of the License, or (at your option) any later version.
> +#
> +# This library is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +# Lesser General Public License for more details.
> +#
> +# You should have received a copy of the GNU Lesser General Public
> +# License along with this library; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
> +
> +${log_dir}/*log {
> +    daily
> +    nomail
> +    maxsize 10M
> +    rotate 10
> +    nomissingok
> +    compress
> +}
> +
> diff --git a/src/wok/config.py.in b/src/wok/config.py.in
> index c6b1db2..e46602d 100644
> --- a/src/wok/config.py.in
> +++ b/src/wok/config.py.in
> @@ -83,6 +83,7 @@ class Paths(object):
>               self.src_dir = '@wokdir@'
>               self.plugins_dir = '@wokdir@/plugins'
>               self.mo_dir = '@prefix@/share/locale'
> +            self.logrotate_dir = "@sysconfdir@/logrotate.d/"
>           else:
>               self.nginx_conf_dir = self.add_prefix('src/nginx')
>               self.state_dir = self.add_prefix('data')
> @@ -91,6 +92,7 @@ class Paths(object):
>               self.src_dir = self.add_prefix('src/wok')
>               self.plugins_dir = self.add_prefix('src/wok/plugins')
>               self.mo_dir = self.add_prefix('mo')
> +            self.logrotate_conf = ""
>
>           for font in FONT_FILES.keys():
>               paths = FONTS_PATH[font]
> diff --git a/src/wok/server.py b/src/wok/server.py
> index c2f6c65..f69d39d 100644
> --- a/src/wok/server.py
> +++ b/src/wok/server.py
> @@ -25,16 +25,17 @@ import logging
>   import logging.handlers
>   import os
>
> +from string import Template
>   from wok import auth
>   from wok import config
> -from wok.config import WokConfig, PluginConfig
> +from wok.config import config as configParser
> +from wok.config import paths, PluginConfig, WokConfig
>   from wok.control import sub_nodes
>   from wok.model import model
>   from wok.proxy import start_proxy, terminate_proxy
>   from wok.root import WokRoot
>   from wok.utils import get_enabled_plugins, import_class
>
> -
>   LOGGING_LEVEL = {"debug": logging.DEBUG,
>                    "info": logging.INFO,
>                    "warning": logging.WARNING,
> @@ -99,24 +100,34 @@ class Server(object):
>           if dev_env:
>               cherrypy.log.screen = True
>
> -        # Create handler to rotate access log file
> -        h = logging.handlers.RotatingFileHandler(options.access_log, 'a',
> -                                                 10000000, 1000)
> +        # Create handler to access log file
> +        h = logging.handlers.WatchedFileHandler(options.access_log, 'a', delay=1)
>           h.setLevel(logLevel)
>           h.setFormatter(cherrypy._cplogging.logfmt)
>
>           # Add access log file to cherrypy configuration
>           cherrypy.log.access_log.addHandler(h)
>
> -        # Create handler to rotate error log file
> -        h = logging.handlers.RotatingFileHandler(options.error_log, 'a',
> -                                                 10000000, 1000)
> +        # Create handler to error log file
> +        h = logging.handlers.WatchedFileHandler(options.error_log, 'a', delay=1)
>           h.setLevel(logLevel)
>           h.setFormatter(cherrypy._cplogging.logfmt)
>
> -        # Add rotating log file to cherrypy configuration
> +        # Add error log file to cherrypy configuration
>           cherrypy.log.error_log.addHandler(h)
>
> +        # redefine logrotate configuration according to wok.conf
> +        with open(os.path.join(paths.logrotate_dir, "wokd.in")) as template:
> +            data = template.read()
> +
> +        data = Template(data)
> +        data = data.safe_substitute(log_dir=configParser.get("logging", "log_dir"))
> +
> +        # Write file to be used for nginx.
> +        config_file = open(os.path.join(paths.logrotate_dir, "wokd"), "w")
> +        config_file.write(data)
> +        config_file.close()
> +
>           # Handling running mode
>           if not dev_env:
>               cherrypy.config.update({'environment': 'production'})




More information about the Kimchi-devel mailing list