【问题标题】:Log file creates too many entries but I don't know why日志文件创建了太多条目,但我不知道为什么
【发布时间】:2017-03-07 08:32:46
【问题描述】:

我编写了一个程序,每次运行该程序时都应将数据写入一个单独的文件。这是第一次工作,但是一旦我再次运行程序,它会生成 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')

【问题讨论】:

  • 这就是 FileHandler 的工作方式。它将日志消息附加到文件中。你希望它做什么?或者更确切地说..你想达到什么目标?
  • @nir0s 我编辑了我的问题。我想要实现的是程序每秒或可能 2 秒记录一条消息,但只有一条消息,当我多次运行程序时,它会多次添加相同的消息,而不是一次。

标签: python python-2.7 file logging


【解决方案1】:

模式:由一个字符串组成,其中包含在运行时被替换的特殊组件:

"%u" 解决冲突的唯一编号

请查看以下链接:http://docs.oracle.com/javase/7/docs/api/java/util/logging/FileHandler.html

【讨论】:

    【解决方案2】:

    你正在奇怪地配置你的记录器:)

    删除:

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

    它会向文件中写入一条消息。请注意,正如您所说,它会在打印每条日志消息之前覆盖该文件,因此当程序一次又一次地运行时,您将不会获得由多个条目组成的文件。

    【讨论】:

    • 好的,我试过了,它确实有点帮助。现在文件如下所示: 2017 年 3 月 7 日上午 10:12:00 - loghistory.log - 调试 - 2 公里内至少有 1 架飞机 2017 年 3 月 7 日上午 10:12:18 - loghistory.log - 调试 - 2 公里内至少有 1 架飞机 2017 年 3 月 7 日上午 10:12:18 - loghistory.log - 调试 - 2 公里内至少有 1 架飞机 2017 年 3 月 7 日上午 10:12:18 - loghistory.log - 调试 - 2 公里内至少有 1 架飞机 03/07/2017 上午 10:12:18 - loghistory.log - 调试 - 2 公里内至少有 1 架飞机 所以最后一个条目仍然重复
    • 其实我只是注意到它并不能解决问题
    • 那我可能误会了什么。如果您希望日志文件中有多个日志消息,则不会这样做。您正在传递 'w' 标志,这意味着它每次只会打印出一条消息。我正在运行代码,它每次都会重新创建包含一条消息的文件。
    • 我知道 'w' 删除了所有早期的消息,我把它放进去,这样我每次运行代码时都不必向下滚动来检查它是否仍然重复条目。我遇到的问题是,该程序当前创建了几个具有相同时间戳的条目,它应该只创建一个条目
    • 我删除了 'w' 标志,无论我提供哪个 q1 和 q2 值,它都会写入一个条目。也许你有额外的代码,这个导入定义了另一个记录器,所以它记录了两次?
    【解决方案3】:
    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 
    

    我使用这个函数来写日志。这是写日志的最简单的方法(根据我)。

    【讨论】:

    • 使用内置日志记录模块是有原因的,例如易于格式化和处理编码以及多个处理程序的单一配置......
    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多