2017-03-07 74 views
1

我写了一个程序,应该在每次运行程序时将数据写入单独的文件。这是第一次,但只要我再次运行该程序,它会创建2个条目,第三个创建4个条目等等。我根本找不到这个错误。日志文件创建了太多的条目,但我不知道为什么

这是代码的一部分,应该使在新文件中的条目:

import datetime    
import logging 

logging.basicConfig(filename='loghistory.log', filemode='w', level=logging.DEBUG) 
logger = logging.getLogger('loghistory.log') 
ch = logging.FileHandler('loghistory.log',mode='w') 
# to empty exisiting file: logging.FileHandler('loghistory.log', mode ='w') 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p') 
ch.setFormatter(formatter) 
logger.addHandler(ch) 
logger.setLevel(logging.DEBUG) 

if q2==0 and q1==0: 
    logger.debug('No airplanes within 5 km') 
else: 
    if q2 ==0 and q1>0: 
     logger.debug('At least 1 airplane within 5 km') 
    else: 
     if q2>0: 
      logger.debug('At least 1 airplane within 2 km') 

这是它目前的样子:

03/07/2017 09:06:21 AM - loghistory.log - DEBUG - At least 1 airplane within 2 km 
03/07/2017 09:06:21 AM - DEBUG:loghistory.log:At least 1 airplane within 2 km 
03/07/2017 09:06:21 AM - loghistory.log - DEBUG - At least 1 airplane within 2 km 

,但它应该是这样的:

03/07/2017 09:06:21 AM - At least 1 airplane within 2 km 
03/07/2017 09:06:22 AM - At least 1 airplane within 2 km 
03/07/2017 09:06:23 AM - At least 1 airplane within 2 km 

每秒(或2秒)一个新的条目。

这里是整个代码:

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
import pandas as pd 
import math 
import numpy as np 
import winsound 
from Tkinter import * 


#---------------------------------------------------------------------------------- 
# import and reduce data and change it to distances 

data = np.genfromtxt("c:/kenny/daten/daten1s55.py",dtype = np.str,delimiter=",") 
x=data 
y11=[] 
z=[] 
w1=[] 
w2=[] 
w3=[] 
i=0 
for i in range(len(x)): 
    if (len(x[i][14]) > 0): 
     y11.append((math.acos(math.sin(math.radians(float(x[i][14])))*math.sin(math.radians(54.102427))+math.cos(math.radians(54.102427))*math.cos(math.radians(float(x[i][14])))*math.cos(math.radians(11.735042-float(x[i][15])))))*6378.388) 
     z.append(x[i][4]) 
     w1.append(x[i][14]) 
     w2.append(x[i][15]) 
     w3.append(x[i][11]) 

v=np.column_stack((z,y11,w1,w2,w3)) 
M = pd.DataFrame(v) 
"""M.columns=['Flightcode','Distance','Lat','Long','Height']""" 
M[1] = M[1].astype(float) 
M1=M.sort([0,1]) 
M2=M1.reset_index(drop=True) 

v1=[] 
v2=[] 
v3=[] 
v4=[] 
v5=[] 
ii=0 
v1.append(M2[0][0]) 
v2.append(M2[1][0]) 
v3.append(M2[2][0]) 
v4.append(M2[3][0]) 
v5.append(M2[4][0]) 
for ii in range(len(z)): 
    if M2[0][ii] <> v1[-1]: 
     v1.append(M2[0][ii]) 
     v2.append(M2[1][ii]) 
     v3.append(M2[2][ii]) 
     v4.append(M2[3][ii]) 
     v5.append(M2[4][ii]) 

Data_gekuertzt1=np.column_stack((v1,v2,v3,v4,v5)) 
Data_gekuertzt= pd.DataFrame(Data_gekuertzt1) 

#---------------------------------------------------------------------------------- 
# alert when airplane closer than 2 or 5 km 

q1=0 
q2=3 

for k in range(len(Data_gekuertzt)): 
    if v2[k] <=5 and v2[k]>2: 
      q1+=1 
    else: 
     if v2[k]<=2: 
       q2+=1 
if q2 > 0: 
    winsound.Beep(600,2000) 
    root = Tk() 
    root.geometry('{}x{}'.format(520, 300)) 
    w = Label(root, text= 'Airplane within 2 km radius',fg = "red",font = "Helvetica 30 bold italic") 
    w.pack() 
    root.mainloop() 

if q1 >0: 
    winsound.Beep(300,2000) 



#--------------------------------------------------------------------------------------- 
#create a logfile 


import datetime    
import logging 


logger = logging.getLogger('loghistory.log') 
ch = logging.FileHandler('loghistory.log') 
# to empty exisiting file: logging.FileHandler('loghistory.log', mode ='w') 
formatter = logging.Formatter('%(asctime)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p') 
ch.setFormatter(formatter) 
logger.addHandler(ch) 
logger.setLevel(logging.DEBUG) 

if q2==0 and q1==0: 
    logger.debug('No airplanes within 5 km') 
else: 
    if q2 ==0 and q1>0: 
     logger.debug('At least 1 airplane within 5 km') 
    else: 
     if q2>0: 
      logger.debug('At least 1 airplane within 2 km') 
+0

这就是FileHandler的工作原理。它将日志消息附加到文件中。你期望它做什么?或者说,你想实现什么目标? – nir0s

+0

@ nir0s我eddited我的问题。我想实现的是程序每隔一秒钟或2秒记录一条消息,但只记录一条消息,当我多次运行该程序时,它会多次添加相同的消息而不是一次。 – Kenny

回答

-1
import datetime 
import os 
def write_log(filename, log_data): 
    curr_time = datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S') 
    try: 
     if not os.path.exists("my_logs"): 
      os.makedirs("my_logs") 
     with open("my_logs/"+filename, "a") as text_file: 
      text_file.write(curr_time + "\t" + log_data + "\n") 
    except: 
     return 

我用这个函数写日志。这是写日志最简单的方法(按我)。

+0

有一个使用内置日志记录模块的原因,如简单的格式化和处理多个处理程序的编码和单个配置... – nir0s

0

你奇怪的配置您的记录:)

删除:

logging.basicConfig(filename='loghistory.log', filemode='w', level=logging.DEBUG) 

,它会返回一个消息到文件。请注意,如您所述,它会在打印每条日志消息之前覆盖文件,因此程序一次又一次地运行时,您将无法获取包含多个条目的文件。

+0

好吧,我试过这个,它实际上有点帮助。 现在的文件看起来像这样: 03/07/2017 10:12:00 AM - loghistory.log - DEBUG - 2公里内至少有1架飞机 03/07/2017 10:12:18 AM - loghistory。日志 - DEBUG - 至少1个2公里以内 2017年3月7日上午10点12分18秒飞机 - loghistory.log - DEBUG - 至少1飞机2公里 2017年3月7日上午10点12分18秒内 - loghistory.log - DEBUG - 2公里内至少有1架飞机 03/07/2017 10:12:18 AM - loghistory。日志 - 调试 - 2公里内至少有1架飞机 所以最后一个条目仍然重复 – Kenny

+0

其实我只是注意到它不能解决问题 – Kenny

+0

然后我可能会误解一些东西。如果您希望日志文件中有多条日志消息,则不会这样做。您正在传递'w'标志,这意味着每次只打印一条消息。我正在运行代码,并且每次都在其中重新创建一个包含单个消息的文件。 – nir0s

相关问题