trailing spaces
[tests.git] / qaapi / qa / logger.py
1 import os
2 import traceback
3 import time
4 import sys
5 import commands
6
7 class Logfile:
8     """
9     Represents a logfile. Used to write data to a file. e.g.
10
11         logfile = Logfile('filename')
12         print >> logfile, data          
13     """         
14     def __init__(self, filename, date_in_filename = True):
15         
16         # whats the date
17         localtime = time.localtime()
18         (year, month, day) = localtime[:3]
19         date = "%(year)s.%(month)s.%(day)s" % locals()
20
21         # append date to filename
22         if date_in_filename:
23             if filename.find(".log") > -1:
24                 filename = filename.split(".log")[0] 
25             filename = "%(filename)s-%(date)s.log" % locals()
26         
27         filename_parts = filename.split(os.sep)
28         # Add directory (qaapi) to files path
29         if 'qaapi' not in filename_parts: 
30             filename_parts.insert(len(filename_parts)-1, 'qaapi')
31         # Add directory(today's date) to file's path
32         if date not in filename_parts:
33             filename_parts.insert(len(filename_parts)-1, date)
34          
35         # Make sure file's parent directory exists
36         self.dir = filename_dir = os.sep + os.sep.join(filename_parts[:-1]) + os.sep
37         filename = os.sep + os.sep.join(filename_parts) 
38         (status, output) = commands.getstatusoutput("mkdir -p %(filename_dir)s" % locals())
39         self.filename = filename
40
41     def rotate(self):
42         if os.path.isfile(self.filename):
43             (status, output) = utils.commands("ls %s*" % self.filename)
44             files = output.split("\n")
45             files.sort()
46             lastfile = files[-1:][0]
47             index = lastfile.split(self.logfile.filename)[1].replace(".", "")
48         
49             if not index:
50                 index = "1"
51             else:
52                 index = str(int(index) +1)
53             utils.commands("mv %s %s.%s" % (self.filename, self.filename, index))               
54                 
55
56     def write(self, data):
57         try:
58             fd = os.open(self.filename, os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0644)
59             os.write(fd, '%s' % data)
60             os.close(fd)
61         except OSError:
62             sys.stderr.write(data)
63             sys.stderr.flush()
64
65 log_filename = '/var/log/qaapi.log'
66 logfile = Logfile(log_filename)
67
68 def log(method, method_name = None, \
69         log_filename = 'system.log', errorlog_filename = 'system_error.log'):
70     """
71     Logs whether the specified method completed successfully or not and 
72     returns the method result. Use as a decorator, e.g.,
73         
74         @log
75         def foo(...):
76             ...
77         
78     Or:
79         def foo(...):
80             ...
81         foo = log(foo)
82
83     Or:
84         result = log(foo)(...)                  
85
86     """
87     logfile = Logfile(log_filename)
88     error_logfile = Logfile(errorlog_filename)                  
89     
90     if method_name is None:
91         method_name = method.__name__
92     
93     def wrapper(*args, **kwds):
94         
95         print >> logfile, method_name + ": ",
96         try:
97             #print >> logfile, args, 
98             result = method(*args, **kwds)
99             print >> logfile, " [OK]"
100         except:
101             print >>logfile, " [FAILED]"
102             print >> error_logfile, "%s: %s\n" % (method_name, traceback.format_exc())
103             raise
104
105     return wrapper
106