我有一个clickonce应用程序,我为这个应用程序设置了几个文件处理程序(为了这个例子,我想处理带有.aaa或.bbb扩展的文件).
如果我选择一个带有这些扩展名的文件,我的应用程序会按预期启动,一切都很好.但是,如果我选择多个文件并打开它们(通过点击Enter或右键单击并选择" 打开"),则会启动多个我的同步实例 - 每个文件被选中一个实例.
这不是我期望的行为,我只希望一个实例以多个文件条目开头AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.这可以实现,还是我的期望不正确?
编辑:
只是详细说明:我们已经遵循了@Matthias提到的单实例方法,第一个启动实例创建了一个命名服务器管道.然后,后续实例启动,检测到它们是辅助实例,通过命名管道将其命令行参数(filename)传递给主实例,然后退出.主实例通过命名管道接收文件名,并执行其操作(启动文件导入向导).
当用户选择多个文件(即5个文件),然后选择在应用程序中打开这些文件时,就会出现问题.我没有从命令行提供的5个文件名开始一个辅助实例,而是启动了5个应用程序启动的辅助实例,每个实例在命令行上都有一个文件名.然后,每个都创建一个名为pipe的客户端,并将该文件名传递给主实例 - 因此名为pipe的服务器接收5个单独的消息.
跟进想法:
在聊聊之后,我发现这可能只是注册文件处理程序的工作方式,也许它与clickonce无关.也许解决方案是服务器命名管道在收到每条消息后暂停,并在操作之前尝试排队消息?
我正在尝试使用TimedRotatingFileHandler将每日日志保存在单独的日志文件中.旋转按预期完美地工作,但我不喜欢它的工作方式是命名文件.
如果我将日志文件设置为my_log_file.log,这将是"今天"的日志文件,当它在午夜更改时,它将被重命名为最后my_log_file.log.2014-07-08没有.log扩展名,并且my_log_file.log将为该文件创建一个新文件.新的一天.
我想得到的是旧文件被重命名my_log_file.2014-07-08.log甚至my_log_file-2014-07-08.log,主要是最后的.log,而不是中间.此外,我希望"今天"的日志文件已经以今天的日期命名,就像旧日期一样.
有没有办法这样做?
我发现我可以用以下内容个性化后缀:
handler.suffix ="%Y-%m-%d"
但我没有办法删除内部.log部分并强制当前日志文件添加后缀.
得到错误为
“ java.io.IOException:无法获取.. \ log \ abc.log的锁”,不确定为什么会发生这种情况。
有人可以帮我吗?谢谢
logger = LogManager.getLogManager().getLogger(className);
FileHandler logFile = new FileHandler(file);
// create txt Formatter
SimpleFormatter formatterTxt = new SimpleFormatter();
logFile.setFormatter(formatterTxt);
logger.addHandler(logFile);
Run Code Online (Sandbox Code Playgroud) 更新:
TimedRotatingFileHandler我使用时工作不正常multiprocessing,我应该如何处理多处理日志?
我编写了自己的Logger类,如下所示,将其用作所有其他python脚本中的模块.
import logging
import logging.handlers
class Logger:
DEFAULT_LOG_OUTPUT = "/home/haifzhan/"
def __init__(self, logger_name, log_file_name, log_dir=DEFAULT_LOG_OUTPUT, log_level=logging.DEBUG):
self.logger = logging.getLogger(logger_name,)
self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
#self.file_handler = logging.FileHandler(log_dir + log_file_name)
file_path = log_dir + log_file_name
self.file_handler = logging.handlers.TimedRotatingFileHandler(file_path, when='H', backupCount=30)
self.file_handler.setFormatter(self.formatter)
self.logger.setLevel(log_level)
self.logger.addHandler(self.file_handler)
self.console_handler = logging.StreamHandler()
self.console_handler.setFormatter(self.formatter)
self.console_handler.setLevel(logging.DEBUG)
self.logger.addHandler(self.console_handler)
def get_logger(self):
return self.logger
Run Code Online (Sandbox Code Playgroud)
在我的python脚本的顶部,我创建了一个Logger实例.
`logger = Logger("logger name", "logfile.log", log_dir=LOG_DIR, log_level=logging.INFO).get_logger()` # always put it at the top of my script
Run Code Online (Sandbox Code Playgroud)
它在我使用时工作得很好FileHandler,不幸的是它在我切换后省略了记录行TimedRotatingFileHandler …
我使用以下代码来限制日志文件的大小(最小示例):
import logging
from logging.handlers import RotatingFileHandler
# Set up logfile and message logging.
logger = logging.getLogger("Logger")
logger.setLevel(logging.ERROR)
# Create the rotating file handler. Limit the size to 1000000Bytes ~ 1MB .
handler = RotatingFileHandler("test.log", mode='a', maxBytes=1000000, encoding=None, delay=0)
handler.setLevel(logging.ERROR)
# Create a formatter.
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Add handler and formatter.
handler.setFormatter(formatter)
logger.addHandler(handler)
for l in range(1000):
logger.error("test" * 1000)
Run Code Online (Sandbox Code Playgroud)
但是文件大小超出了 1MB 的限制并继续记录。我不明白我做错了什么。有没有办法选择不同的参数来正确限制日志文件的大小?
我想检查两个文件句柄是否引用同一个文件。为此,我可以使用stat应用于每个文件句柄的功能吗?提前致谢
my $file = 'C:\temp\file.txt');
open( TXT1, "> $file" );
open( TXT2, "> $file" );
print( "The handles refer to the same file!") if (\TXT1 eq \TXT2);
Run Code Online (Sandbox Code Playgroud) 我想读取默认输入,如果数据是通过管道输入或提供了文件,但如果没有给出任何内容,我想提供while(<>)执行的默认值.
伪代码:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在每天创建目录的目录中创建日志,但是fileHandler没有创建目录,而是其抛出异常无法获取C:\ dir_date \ Logging.txt的锁(此处dir_date不存在,我正在尝试创建登录到该目录)。我可以通过“ fileHandler”创建目录吗?
FileHandler fileTxt;
fileTxt = new FileHandler("C:\\ff\\Logging.txt");
Run Code Online (Sandbox Code Playgroud)
log4J甚至可以创建目录(如果不存在),这是否可以通过fileHandler进行?
我编写了一个小型 Python 脚本,用于处理夜间转换和音频数据归档。由于在此过程中出现了一些意想不到的问题(文件不存在、与数据库服务器的连接不可靠等等...),我添加了 Python 自己的日志记录工具来跟踪遇到的任何问题。
问题是,日志文件是在脚本运行的任何地方创建的(例如当前工作目录),所以我有两个日志文件,一个在我的主目录中(由 cron 运行脚本时使用),另一个在脚本自己的目录中目录(调试时使用)。我更喜欢将日志文件和配置文件保存在与脚本相同的目录中。
我在这里加载记录器的配置:
logging.config.fileConfig(os.path.join(sys.path[0], 'logger.conf'))
Run Code Online (Sandbox Code Playgroud)
...这是我的相关部分logger.conf:
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=fileFormatter
args=('echi_export.log', 'a',)
Run Code Online (Sandbox Code Playgroud)
绝对路径确实有效,但我有点不愿意使用它们。
简而言之,使用 Pythonlogger模块(尤其是 FileHandler)配置文件日志记录的正确方法是什么?一些现实世界的例子就足够了。
filehandler ×9
logging ×5
python ×4
java ×2
perl ×2
c# ×1
clickonce ×1
command-line ×1
filesize ×1
handler ×1
limit ×1
python-2.7 ×1
stat ×1
stdin ×1
unix ×1