Jul-20-2022, 08:51 AM
(This post was last modified: Jul-20-2022, 11:14 AM by Larz60+.
Edit Reason: Fixed error tags
)
Hello,
I have a problem that I can't seem to understand when using logging with multi files
I have created a simple code that ping IP address from a list and save them into a file
maybe the structere of the code is wrong ?
* the name of the file is HowToLog.py
* I'm using PyCharm so I need to use "__main__" in otder to make it work with the multiprocessing (if now I'm getting error while try to run)
* this is what I get while running this
can someone help \ guide ? how to make this work
Thanks,
*** I took the same code to run on PI4 (Linux OS)
there I removed the __main__ part - and it's working with Pool
I get 5 logs files but the order of the data is wrong - and also I don't have all the data
in each file I only have 5-6 lines
while when in the cmd I can see all the address 4*255 (1024)
so what am I missing \ doing wrong with the logging?
Thanks ,
**final update
when I manually write to a file using
I get all the data correct
so I'm pretty sure I'm missing something in the logging config
I have a problem that I can't seem to understand when using logging with multi files
I have created a simple code that ping IP address from a list and save them into a file
maybe the structere of the code is wrong ?
import os from multiprocessing import Pool import ipaddress import ping3 import logging from logging.handlers import RotatingFileHandler logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', handlers=[RotatingFileHandler(filename=r'C:\\Test\\logs\\CheckOnLine.log', maxBytes=10000, backupCount=5)]) def get_ip_from_subnet(ip_subnet): ips = ipaddress.ip_network(ip_subnet) ip_list = [str(ip) for ip in ips] return ip_list def CheckOnLine(hostname): DeviceTTl = Getttl(hostname) if 200 > DeviceTTl > 0: message = hostname, " TTL - ", DeviceTTl, ' is up!' print(message) logging.info(message) return True elif DeviceTTl > 240: message = hostname + " TTL more then 240" # print(message) logging.info(message) return False else: # print(hostname, ' OFFLINE!') return False def Getttl(ip): try: result = os.popen("ping -n 1 -w 2000 " + ip).read() # print(result) except Exception as e: print(e) logging.info(e) return -1 else: n = result.find("TTL=") if n > 0: ttl = result[n + 4:] # print(ttl) n = ttl.find("\n") if n > 0: # print(ttl[:n]) return int(ttl[:n]) else: message = ip + ' Offline' print(message) logging.info(message) return -1 def main(): with Pool(50) as p: try: List = p.map(CheckOnLine, TestList) except Exception as t: print('Pool error - ', str(t)) logging.info(t) if __name__ == '__main__': List192 = get_ip_from_subnet('192.168.5.0/24') List101 = get_ip_from_subnet('10.10.2.0/24') List172 = get_ip_from_subnet('172.16.5.0/24') List106 = get_ip_from_subnet('10.68.30.0/24') TestList = List192+ List101 + List172 + List106 main()points:
* the name of the file is HowToLog.py
* I'm using PyCharm so I need to use "__main__" in otder to make it work with the multiprocessing (if now I'm getting error while try to run)
* this is what I get while running this
Error:--- Logging error ---
Traceback (most recent call last):
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\logging\handlers.py", line 70, in emit
self.doRollover()
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\logging\handlers.py", line 171, in doRollover
self.rotate(self.baseFilename, dfn)
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\logging\handlers.py", line 111, in rotate
os.rename(source, dest)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Test\\logs\\CheckOnLine.log' -> 'C:\\Test\\logs\\CheckOnLine.log.1'
Call stack:
File "<string>", line 1, in <module>
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\spawn.py", line 129, in _main
return self._bootstrap(parent_sentinel)
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 315, in _bootstrap
self.run()
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\pool.py", line 125, in worker
result = (True, func(*args, **kwds))
File "C:\Users\David\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\pool.py", line 48, in mapstar
return list(map(*args))
File "C:\Users\David\PycharmProjects\pythonProject4\HowToLog.py", line 22, in CheckOnLine
DeviceTTl = Getttl(hostname)
File "C:\Users\David\PycharmProjects\pythonProject4\HowToLog.py", line 58, in Getttl
logging.info(message)
Message: '10.10.2.76 Offline'
Arguments: ()
Process finished with exit code -1
I guess I'm missing something in the setting \ config can someone help \ guide ? how to make this work
Thanks,
*** I took the same code to run on PI4 (Linux OS)
there I removed the __main__ part - and it's working with Pool
import os from multiprocessing import Pool import ipaddress #import ping3 import logging from logging.handlers import RotatingFileHandler logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', handlers=[RotatingFileHandler(filename=r'/home/pi/logs/CheckOnLine.log', maxBytes=100000, backupCount=5)]) def get_ip_from_subnet(ip_subnet): ips = ipaddress.ip_network(ip_subnet) ip_list = [str(ip) for ip in ips] return ip_list def CheckOnLine(hostname): DeviceTTl = Getttl(hostname) try: if 200 > DeviceTTl > 0: message = hostname + " TTL - " + str(DeviceTTl) + ' is up!' print(message) logging.info(message) return True elif DeviceTTl > 240: message = hostname + " TTL more then 240" print(message) logging.info(message) return False else: # print(hostname, ' OFFLINE!') return False except TypeError as Te1: print(hostname + ' ' + str(Te1)) except Exception as e: print(hostname + ' ' + str(e)) def Getttl(ip): try: result = os.popen("ping -c 1 -w 2 " + ip).read() # print(result) except Exception as e: print(e) logging.info(e) return -1 else: n = result.find("ttl=") if n > 0: ttl = result[n + 4:] # print(ttl) n = ttl.find(" ") if n > 0: # print(ttl[:n]) return int(ttl[:n]) else: message = ip + ' Offline' print(message) logging.info(message) return -1 List192 = get_ip_from_subnet('192.168.5.0/24') List101 = get_ip_from_subnet('10.10.2.0/24') List172 = get_ip_from_subnet('172.16.5.0/24') List106 = get_ip_from_subnet('10.68.30.0/24') TestList = List199 + List109 + List136 + List137 with Pool(50) as p: try: List = p.map(CheckOnLine, TestList) except Exception as t: print('Pool error - ', str(t)) logging.info(t) logging.info('done!')but the logs are not OK
I get 5 logs files but the order of the data is wrong - and also I don't have all the data
in each file I only have 5-6 lines
while when in the cmd I can see all the address 4*255 (1024)
so what am I missing \ doing wrong with the logging?
Thanks ,
**final update
when I manually write to a file using
with open(Data.log, 'a') as my_file: my_file.write(messge'\n\r') my_file.close()after the logging.info(messge)
I get all the data correct
so I'm pretty sure I'm missing something in the logging config