Hi everybody,

I don't have any issue(for now) but I wrote a small python script to help search through the asterisk messages file.

The script will parse 'messages' and then put the relevant info into a database(I chose mysql) so you can run any queries you like, instead of having to troll through the text file or do any fancy grepping.

This is the first time I've ever contributed something like this and I am an asterisk nooby for sure, please forgive my ignorance. There is probably something in asterisk that already does this, but I could find it and I thought somebody else might want to do a similar thing. All comments welcome. I've attached the file as well as pasted the contents below.


#!/usr/bin/python2.5
import re
import MySQLdb

connection = MySQLdb.connect("server(probably localhost)","user","password","your_database")
logFile = open('/path/to/asterisk/messages','r') #probably /var/log/

#dictionary to convert the month in the log file to something MySQL will understand month_to_number = {'jan':'01','feb':'02','mar':'03','apr':'04','may':'05','jun':'06','jul':'07','aug':'08','sep':'09','oct':'10','nov':'11','dec':'12'}

for line in logFile.readlines():

#our log file had some lines that had 'Input:' or '^' and that was it. This is hacky but should get the job done for ignoring those lines.
 if(len(line)>10):
   #get the month of the message
   pattern = re.compile('\[?[A-Z][a-z][a-z]')
   month_pattern = pattern.match(line)
month = month_to_number[month_pattern.string[month_pattern.start():month_pattern.end()].replace(' ','').replace('[','').lower()]

   #get the date of the message
   pattern = re.compile('\s\s?\d\d?')
   date_pattern = pattern.search(line)
date = date_pattern.string[date_pattern.start():date_pattern.end()].replace(' ','')

   #get the time of the message
   pattern = re.compile('\d\d\:\d\d\:\d\d')
   time_pattern = pattern.search(line)
   time = time_pattern.string[time_pattern.start():time_pattern.end()]

   #get the message type e.g. ERROR, WARNING, NOTICE, ect
   pattern = re.compile('[A-Z]+\[')
   message_type_pattern = pattern.search(line)
message_type = message_type_pattern.string[message_type_pattern.start():message_type_pattern.end()].replace('[','')

   #get the file the message is from
   pattern = re.compile('\w+\.(c|fl|y)')
   file_pattern = pattern.search(line)
   file_name = ''

#I don't think I need this line anymore as I think the regex above will catch all the different file extensions now
   """
   if (file_pattern):
file_name = file_pattern.string[file_pattern.start():file_pattern.end()]
   else:
     pattern = re.compile('\w+\.fl')
     file_pattern = pattern.search(line)
file_name = file_pattern.string[file_pattern.start():file_pattern.end()]
   """

   #get the message
   pattern = re.compile('\.(c|fl|y):\s.+$')
   message_pattern = pattern.search(line)
message = message_pattern.string[message_pattern.start():message_pattern.end()].replace('.(c|fl|y): ','').replace('?','').replace('!','')

   pattern = re.compile('Registration.+timed\sout')
   registration_pattern = pattern.search(line)

#this variable will only really be used when our connection to our voip provider was lost, otherwise insert and empty string.
   attempt_number=''

   if(registration_pattern):
     #get the attempt number for registration to Digital Voice
     pattern = re.compile('#\d+')
     attempt_pattern = pattern.search(line)
attempt_number = attempt_pattern.string[attempt_pattern.start():attempt_pattern.end()].replace('#','')

#for some reason Asterisk does not log the year of the message, so we have to do this by hand... datetime = '2009-%s-%s %s' % (month,date,time) #construct our MySQL datetime string

#print statement for debugging. I recommend using this before you actually insert into the database. #print ("date:%s message_type:%s file:%s message:%s attempt:%s") % (datetime,message_type,file_name,message,attempt_number)

   cursor = connection.cursor()
cursor.execute("""INSERT INTO message (date,message_type,file,message,attempt_number)
                  VALUES (%s, %s, %s, %s, %s)""",
[datetime,message_type,file_name,message,attempt_number] )

#close our connection to the database
logFile.close()




#!/usr/bin/python2.5
import re
import MySQLdb 

connection = MySQLdb.connect("server(probably 
localhost)","user","password","your_database")
logFile = open('/path/to/asterisk/messages','r') #probably /var/log/

#dictionary to convert the month in the log file to something MySQL will 
understand
month_to_number = 
{'jan':'01','feb':'02','mar':'03','apr':'04','may':'05','jun':'06','jul':'07','aug':'08','sep':'09','oct':'10','nov':'11','dec':'12'}

for line in logFile.readlines():

  #our log file had some lines that had 'Input:' or '^' and that was it. This 
is hacky but should get the job done for ignoring those lines.
  if(len(line)>10): 
    #get the month of the message
    pattern = re.compile('\[?[A-Z][a-z][a-z]')
    month_pattern = pattern.match(line)
    month = 
month_to_number[month_pattern.string[month_pattern.start():month_pattern.end()].replace('
 ','').replace('[','').lower()]

    #get the date of the message
    pattern = re.compile('\s\s?\d\d?')
    date_pattern = pattern.search(line)
    date = 
date_pattern.string[date_pattern.start():date_pattern.end()].replace(' ','')

    #get the time of the message
    pattern = re.compile('\d\d\:\d\d\:\d\d')
    time_pattern = pattern.search(line)
    time = time_pattern.string[time_pattern.start():time_pattern.end()]
  
    #get the message type e.g. ERROR, WARNING, NOTICE, ect
    pattern = re.compile('[A-Z]+\[')
    message_type_pattern = pattern.search(line)
    message_type = 
message_type_pattern.string[message_type_pattern.start():message_type_pattern.end()].replace('[','')

    #get the file the message is from
    pattern = re.compile('\w+\.(c|fl|y)')
    file_pattern = pattern.search(line)
    file_name = ''

    #I don't think I need this line anymore as I think the regex above will 
catch all the different file extensions now
    """
    if (file_pattern):
      file_name = file_pattern.string[file_pattern.start():file_pattern.end()]
    else:
      pattern = re.compile('\w+\.fl')
      file_pattern = pattern.search(line)
      file_name = file_pattern.string[file_pattern.start():file_pattern.end()]
    """

    #get the message
    pattern = re.compile('\.(c|fl|y):\s.+$')
    message_pattern = pattern.search(line)
    message = 
message_pattern.string[message_pattern.start():message_pattern.end()].replace('.(c|fl|y):
 ','').replace('?','').replace('!','')

    pattern = re.compile('Registration.+timed\sout')
    registration_pattern = pattern.search(line)

    #this variable will only really be used when our connection to our voip 
provider was lost, otherwise insert and empty string.
    attempt_number=''

    if(registration_pattern):
      #get the attempt number for registration to Digital Voice
      pattern = re.compile('#\d+')
      attempt_pattern = pattern.search(line)
      attempt_number = 
attempt_pattern.string[attempt_pattern.start():attempt_pattern.end()].replace('#','')

    #for some reason Asterisk does not log the year of the message, so we have 
to do this by hand...
    datetime = '2009-%s-%s %s' % (month,date,time) #construct our MySQL 
datetime string

    #print statement for debugging. I recommend using this before you actually 
insert into the database.
    #print ("date:%s message_type:%s file:%s message:%s attempt:%s") % 
(datetime,message_type,file_name,message,attempt_number)

    cursor = connection.cursor()
    cursor.execute("""INSERT INTO message 
(date,message_type,file,message,attempt_number)
                   VALUES (%s, %s, %s, %s, %s)""",
                   [datetime,message_type,file_name,message,attempt_number] )

#close our connection to the database
logFile.close()
_______________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to