[Kimchi-devel] [PATCH] [Wok] Bugfix 33: Implement a multiprocess file handler for log system
Lucio Correia
luciojhc at linux.vnet.ibm.com
Tue Feb 16 11:45:38 UTC 2016
Reviewed-By: Lucio Correia <luciojhc at linux.vnet.ibm.com>
On 15-02-2016 21:45, Jose Ricardo Ziviani wrote:
> - This commit adds a new watched file handler, used in Wok, but it uses
> a recursive lock before emitting the log register to avoid possible
> concurrency issues since multiple processes will write in the same
> log file.
>
> Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
> ---
> *NOTE*: based on '[PATCH] [Wok] Bugfix 30: Duplicated log messages'
>
> src/wok/safewatchedfilehandler.py | 44 +++++++++++++++++++++++++++++++++++++++
> src/wok/server.py | 4 ++--
> 2 files changed, 46 insertions(+), 2 deletions(-)
> create mode 100644 src/wok/safewatchedfilehandler.py
>
> diff --git a/src/wok/safewatchedfilehandler.py b/src/wok/safewatchedfilehandler.py
> new file mode 100644
> index 0000000..c5fad85
> --- /dev/null
> +++ b/src/wok/safewatchedfilehandler.py
> @@ -0,0 +1,44 @@
> +#
> +# Project Kimchi
> +#
> +# 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
> +
> +from logging.handlers import WatchedFileHandler
> +from multiprocessing import RLock
> +
> +
> +class SafeWatchedFileHandler(WatchedFileHandler):
> +
> + def __init__(self, filename, mode='a', encoding=None, delay=0):
> + WatchedFileHandler.__init__(self, filename, mode, encoding, delay)
> + self._lock = RLock()
> +
> + def close(self):
> + self._lock.acquire(timeout=2)
> + try:
> + WatchedFileHandler.close(self)
> +
> + finally:
> + self._lock.release()
> +
> + def emit(self, record):
> + self._lock.acquire(timeout=2)
> + try:
> + WatchedFileHandler.emit(self, record)
> +
> + finally:
> + self._lock.release()
> diff --git a/src/wok/server.py b/src/wok/server.py
> index 13851e8..75b41d5 100644
> --- a/src/wok/server.py
> +++ b/src/wok/server.py
> @@ -35,6 +35,7 @@ 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.safewatchedfilehandler import SafeWatchedFileHandler
> from wok.utils import get_enabled_plugins, import_class
>
> LOGGING_LEVEL = {"debug": logging.DEBUG,
> @@ -122,8 +123,7 @@ class Server(object):
> cherrypy.log.access_log.addHandler(h)
>
> # Create handler to error log file
> - h = logging.handlers.WatchedFileHandler(options.error_log, 'a',
> - delay=1)
> + h = SafeWatchedFileHandler(options.error_log, 'a', delay=1)
> h.setLevel(logLevel)
> h.setFormatter(cherrypy._cplogging.logfmt)
>
--
Lucio Correia
Software Engineer
IBM LTC Brazil
More information about the Kimchi-devel
mailing list