RotatingFileHandler Fails

Jean-Michel Pichavant jeanmichel at sequans.com
Mon Mar 5 11:27:50 CET 2012


nac wrote:
> The RotatingFileHandler running on win 7 64-bit; py 2.7 is failing
> when the script launches a process using subprocess.Popen. Works fine
> if the subprocess is not launched
>
> The exception thrown
> Traceback (most recent call last):
>   File "C:\Python27\lib\logging\handlers.py", line 78, in emit
>     self.doRollover()
>   File "C:\Python27\lib\logging\handlers.py", line 141, in doRollover
>     os.rename(self.baseFilename, dfn)
> WindowsError: [Error 32] The process cannot access the file because it
> is being used by another process
>
> Anyone have an idea how to fix this?
>
>
> import os, sys
> import logging
> import logging.handlers
> import subprocess
>
> def chomp(s):
>       "remove trailing carriage return"
>       if s[-1:]=='\n': return s[:-1]
>       else: return s
>
> logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %
> (name)-2s %(levelname)-8s %(threadName)-12s %(message)s')
> q5Logger = logging.getLogger('Q5')
> logFileHandler = logging.handlers.RotatingFileHandler(filename='c:\
> \logger\\q5.log', mode= 'a', maxBytes=100, backupCount=5)
> logFileHandler.setFormatter(logging.Formatter('%(asctime)s %(name)-2s %
> (levelname)-8s %(threadName)-12s %(message)s'))
> logFileHandler.setLevel(logging.DEBUG)
> q5Logger.addHandler(logFileHandler)
>
> progOutput = subprocess.Popen(r'dir *.*', shell=True, bufsize=1000,
> stdout=subprocess.PIPE).stdout
> line = progOutput.readline()
> while (line) != "":
>       q5Logger.info( chomp(line))
>       line = progOutput.readline()
> rc = progOutput.close()
>   
I don't think you can open a file from 2 different processes, hence the 
error message. The only exception would be that one of them opens it in 
read only mode which won't happen for log file.

You cannot fix it, it is the operand system that blocks the operation.
Using thread may allow you to log into the same file, but could bring a 
bunch of other problems.

I know some ppl use a log server, your processes using a socket (client) 
logger. You could do that on your local machine. There's a tutorial on 
that in the logging documentation.

JM



More information about the Python-list mailing list