Problems writing to file
Bernard Lebel
3dbernard at gmail.com
Tue Mar 21 16:49:50 EST 2006
Hi Gary,
That is actually what I do. Each time the program prints something to
the file, it flushes the buffer. I also tried opening and closing the
file, same result.
I could indeed post the code. That is only a fraction of the program,
as the log is managed through the Queue module:
def __nodeLog( self, iCallerLevel, sJobID, sMsg ):
"""
The method checks for an override in loglevel given by command line argument.
If such override has been set (using the 'loglevel' argument), then
the command line value is used.
ARGUMENTS:
iCallerLevel (integer): level of verbosity to use, applies only to
node type of logging
sJobID (string): the JobID of the job, if applies
sMsg (string): node line to print
"""
# Check if a log level was set through command line
if 'loglevel' in dCmdLineArgs:
# Log level set through command line, override any other log level
sLogLevel = dCmdLineArgs[ 'loglevel' ]
iLogLevel = int( sLogLevel )
else:
iLogLevel = self.loglevel
if iCallerLevel <= iLogLevel:
# Forge line to print into node log
sLine = '%s %s [jobid: %s]: %s\n' % ( NAME, time.ctime(), str(
sJobID ), sMsg )
if self.printmsg == True: print sLine
# Check if user specified extraction command line arguments
for sArg, tValue in dCmdLineArgs.items():
if 'extractlog' in sArg:
sLogLevel = tValue[0]
sLogType = tValue[1]
# Check if caller level is same as log level defined by the
extract argument
if str( iCallerLevel ) == sLogLevel:
sExtractLogFile = os.path.join( self.NODELOGS, '%s_%s.log' % (
NAME, sLogType ) )
self.__output( sExtractLogFile, sLine )
self.__output( self.MAINLOGFILENAME, sLine )
def __output( self, sLogFile, sLine ):
"""
Try to write to the log file.
ARGUMENTS:
sLogFile (string): the log file
sPrint (string): the line to print
"""
# Try 3 times to write to the output file
for i in range(3):
# Try to output the message
try:
oLogFile = file( sLogFile, 'a+' )
oLogFile.write( sLine )
oLogFile.close()
return LOGOPSUCCESS
except IOError:
if i == 2:
if self.printmsg == True:
print '\nERROR > log.__output : All attempts to write to log
file %s failed, latest updates will be lost.\n' % ( sLogFile )
return LOGOPFAILURE
else:
if self.printmsg == True:
print '\nWARNING > log.__output : Attempt "%i" to write to log
file %s raised IO Error, next attempt in %s seconds.\n' % ( i+1,
sLogFile, self.LOGWAITTIME )
Thanks
Bernard
On 3/21/06, Gary Herron <gherron at islandtraining.com> wrote:
> Bernard Lebel wrote:
>
> >Hello,
> >
> >I have this strange problem. I have written a program that writes a
> >log to a log file.
> >
> >To start the program (I'm on Linux Fedora Core 3), I used a service.
> >This service runs a bash file, wich in turn runs the Python top
> >program file.
> >
> >Sooner or later the program stops writing to the log file. I have
> >absolutely no clue why would that happen. Since the output of the
> >Python program is not redirected other than to this log file, I have
> >no idea why it's doing this. But the Python process appears still
> >alive and well!
> >
> >But the strange thing is that if I run the program directly from a
> >bash shell, no problem whatsoever, the programs runs smoothly and
> >never stops writing to the file, until I kill it.
> >
> >
> >Any suggestion?
> >
> >
> >
> >Thanks in advance
> >Bernard
> >
> >
> Perhaps ...
>
> Output is normally buffered in memory until some threshhold is reached,
> at which point the whole buffer is written, and the process repeats. If
> your output quantity is small, and your impatience is high, you may be
> declaring failure before the buffer fills and triggers a write. The
> solution would be to call flush on the output file after each write (or
> perhaps just wait more patiently).
>
> If the output is voluminous, then it's probably something else ... but I
> don't know what. Perhpas you could post your code.
>
> Gary Herron
>
>
More information about the Python-list
mailing list