小编Rbj*_*bjz的帖子

Log4Net RollingFileAppender没有使用低容量日志刷新IO缓冲区

我正在考虑和HENRI COOK一样的问题.据我们从简短描述中可以看出,它被报告为Apache Jira上的一个错误.

我的问题实质上是事件只在应用程序关闭时记录(甚至在事件发生后几周).当记录量非常低时会发生这种情况.我在Windows Server 2008 R2上看到了这一点.这可以防止我们捕获并对生产错误做出反应.

现在,appender不是缓冲的.默认情况下,每次附加消息时,它还会在基础流上调用Flush().

我的问题是为什么不冲洗?除了以编程方式刷新所有appender之外,还有什么补救措施吗?你会认为一个脉动的appender是一个可行的解决方案吗?

appender配置:

<appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender">
  <param name="File" value="D:\LogFiles\zzzz\xxxxxx__ERROR" />
  <param name="AppendToFile" value="true" />
  <param name="DatePattern" value="_yyyyMMddHH&quot;.log&quot;" />
  <param name="RollingStyle" value="Date" />
  <param name="StaticLogFileName" value="false" />
  <filter type="log4net.Filter.LevelRangeFilter">
    <param name="LevelMin" value="ERROR" />
    <param name="LevelMax" value="FATAL" />
  </filter>
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/>
  </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

更新2013-06-19

我无法用任何代码重现行为.无论我尝试多么糟糕,数据总是立即写入磁盘.但是,进行了一项重要的观察:如果对文件的第一次写入大于1KiB,则修改时间永远不会随后写入更新.只有在关闭时关闭文件时才会更新它.另一方面,如果第一次写入是短的单行,则任何后续写入都将更新修改时间.这种行为在log4net和手动IO操作之间,在32位WinXP和64位W2k8R2之间,在.NET 2.0,3.5和.NET 4.0之间是一致的.这仍然没有解决问题,但至少我现在可以理解奇怪的修改时间模式.

谢谢,罗布

io logging log4net buffer flush

17
推荐指数
1
解决办法
2万
查看次数

为什么从XML变量中插入 - 选择变量表这么慢?

我正在尝试将XML文档中的一些数据插入到变量表中.让我感到震惊的是,同一个select-into(批量)运行时,insert-select需要很长时间,并且在执行查询时,SQL Server进程负责100%的CPU使用率.

我看了一下执行计划,然后发现了差异.insert-select添加了一个额外的"表spool"节点,即使它没有分配成本."表值函数[XML Reader]"然后得到92%.使用select-into,两个"表值函数[XML Reader]"各得49%.

请解释"为什么会发生这种情况"和"如何解决这个问题(优雅地)",因为我确实可以批量插入临时表,然后插入到变量表中,但这只是令人毛骨悚然.

我在SQL 10.50.1600,10.005321上尝试了相同的结果

这是一个测试用例:

declare @xColumns xml
declare @columns table(name nvarchar(300))

if OBJECT_ID('tempdb.dbo.#columns') is not null drop table #columns

insert @columns select name from sys.all_columns

set @xColumns = (select name from @columns for xml path('columns'))

delete @columns

print 'XML data size: ' + cast(datalength(@xColumns) as varchar(30))

--raiserror('selecting', 10, 1) with nowait

--select ColumnNames.value('.', 'nvarchar(300)') name
--from @xColumns.nodes('/columns/name') T1(ColumnNames)

raiserror('selecting into #columns', 10, 1) with nowait

select ColumnNames.value('.', 'nvarchar(300)') name
into #columns
from @xColumns.nodes('/columns/name') T1(ColumnNames)

raiserror('inserting …
Run Code Online (Sandbox Code Playgroud)

xml sql-server variables sql-server-2008

12
推荐指数
2
解决办法
6818
查看次数

在log4net中以JSON身份登录

我正在尝试找出使用log4net将所有日志编写为JSON的sigle行的最佳方法.我希望能够配置任何appender来使用它.任何帮助,将不胜感激.

log4net json

9
推荐指数
2
解决办法
7913
查看次数

如果子查询包含NULL,则使用"IN"子查询的SQL select不返回任何记录

我遇到了这个有趣的行为.我看到左连接是要走的路,但仍然希望将其清除.是设计中的错误还是行为?有什么解释吗?

当我从左表中选择记录时,右表上子查询的结果中不存在值,如果子查询结果为空,则不返回预期的"缺失"记录.我期望将此查询编写为等效的两种方法.

谢谢!

declare @left table  (id int not null primary key identity(1,1), ref int null)
declare @right table (id int not null primary key identity(1,1), ref int null)

insert @left (ref) values (1)
insert @left (ref) values (2)

insert @right (ref) values (1)
insert @right (ref) values (null)

print 'unexpected empty resultset:'
select * from @left
where ref not in (select ref from @right)

print 'expected result - ref 2:'
select * from @left
where ref not in (select …
Run Code Online (Sandbox Code Playgroud)

sql null left-join in-subquery

5
推荐指数
1
解决办法
2720
查看次数

Rust 枚举中 str/String 值的最佳实践是什么?

我有一个非常赏心悦目的东西,但我担心它的含义:

#[derive(Eq, PartialEq, Debug)]
pub enum SmtpHost {     
    DOMAIN(String),
    IPV4(Ipv4Addr),
    IPV6(Ipv6Addr),
    UNKNOWN { label:String, literal:String },
}
Run Code Online (Sandbox Code Playgroud)

我用 PEG 语法来填充它,&str所以所有的字符串调用看起来都是这样的 -SmtpHost::Domain(s.to_string())

我希望这些枚举成为解析器的结果,例如smtp_parser::host< 'input >(s: 'input & str) -> SmtpHost

我也尝试过 ref 方法,但是很快就开始变得笨拙:

#[derive(Eq, PartialEq, Debug)]
pub enum SmtpHost<'a > {     
    DOMAIN(&'a str),
    IPV4(Ipv4Addr),
    IPV6(Ipv6Addr),
    UNKNOWN { label:&'a str, literal:&'a str },
}
Run Code Online (Sandbox Code Playgroud)

所以我要么/要么……但你更清楚。告诉我:o)

我的学习项目供参考

string enums lifetime rust

5
推荐指数
1
解决办法
5245
查看次数

UNC上的PowerShell操作挂起太久了

$to="\\SERVER\Share\Folder"
if(!(test-path $to))
{
    ...
}   
Run Code Online (Sandbox Code Playgroud)

如果服务器处于脱机状态(已解析的名称但没有ping),则测试路径中的调用永远不会返回(在我对脚本时间的狭隘理解中).失败只需要很长时间.最后,在用黄油烤面包后找不到预期的结果,找不到咖啡,跑出去买一些,等待水再次煮沸,找到我的面包冷.回到屏幕看到它就在那里......

与经典DOS目录相同的路径在一些实际时间后按预期失败:

dir "\\SERVER\Share\Folder"
Run Code Online (Sandbox Code Playgroud)

说"找不到网络路径".在不到3分钟!

PS的这种行为真的打破了我的脚本.

确切地说

$t0 = get-date; test-path "\\SERVER\Share\Folder"; $t1 = get-date; ($t1-$t0).TotalSeconds
Run Code Online (Sandbox Code Playgroud)

给我

False
595.2214875
Run Code Online (Sandbox Code Playgroud)

提示:用解析的本地网络脱机PC名称替换SERVER

啊问题是:1)你如何处理这个问题?2)那里的麻烦到底是什么?

更新:使用脱机IP地址时的时序相同.DNS已退出游戏.

Update2:我想知道,有没有人经历过同样浪费的时间?试用64位W2k8R2服务器并没有问题.呼叫最多返回30秒.我的问题出在32位Windows XP PC上.

谢谢,罗布

powershell networking timeout unc

4
推荐指数
1
解决办法
5377
查看次数

c#中的Unix套接字

我正在尝试使用 Mono 的 UnixEndPoint,但在使用它之前就失败了。我在 64 位 Windows 7 系统上运行 Xamarind + .net 4.5。

这里有一些代码证明没有一个组合有效:

foreach(SocketType st in Enum.GetValues(typeof(SocketType)))
    foreach(ProtocolType pt in Enum.GetValues(typeof (ProtocolType)))
    {
        try{
            socket = new Socket (AddressFamily.Unix, st, pt);
            Console.WriteLine("{0} {1}", st, pt);
        }
        catch{

        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上,所有组合都会产生某种类型的套接字错误。

在这里,有人显然使用了它——单声道、c#、套接字、性能——这应该在 Windows 上工作吗?尝试在 WINDOWS 上使用 UNIX 套接字可能很愚蠢?

c# unix sockets windows mono

3
推荐指数
1
解决办法
2186
查看次数

如果我与多个线程共享一个不可变引用,为什么我需要实现`Copy`和`Clone`?

仍在努力应对Rust的思维转变,现在我有了这个用例 - 一个多线程的配置TcpListener:

use std::net::{TcpListener, TcpStream, ToSocketAddrs};
use std::thread;

fn main() {
    serve("127.0.0.1:3333", Configuration { do_something: true });
}

//#[derive(Copy, Clone)]
pub struct Configuration {
    pub do_something: bool,
}

pub fn serve<A: ToSocketAddrs>(addr: A, conf: Configuration) {
    let listener = TcpListener::bind(addr).expect("bind failed");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                thread::spawn(move || {
                    handle_client(stream, &conf);
                });
            }
            Err(e) => {
                println!("Connection failed: {}", e);
            }
        }
    }
}

fn handle_client(stream: TcpStream, conf: &Configuration) {
    if …
Run Code Online (Sandbox Code Playgroud)

multithreading reference rust

3
推荐指数
1
解决办法
184
查看次数

二元运算 == 不能应用于类型 syn::Path

当我使用async-trait 的分支作为依赖项时,由于syn::*类型相等,它无法编译。所有在 async-trait CI checks 中都是绿色的。要重现,请启动一个新的货物库项目并添加到 Cargo.toml:

[dependencies]
syn = { version = "1.0.39", features = ["full"] }
Run Code Online (Sandbox Code Playgroud)

在 lib.rs 中:

pub fn cmp(a: syn::Path, b: syn::Path) -> bool {
    a == b
}
Run Code Online (Sandbox Code Playgroud)

在 Rust 1.46.0 上编译会导致错误:

[dependencies]
syn = { version = "1.0.39", features = ["full"] }
Run Code Online (Sandbox Code Playgroud)

syn::Path实现Eq/PartialEq具有“完整”或“派生”功能

pub fn cmp(a: syn::Path, b: syn::Path) -> bool {
    a == b
}
Run Code Online (Sandbox Code Playgroud)

我探索了 synPartialEqEq …

dependencies compiler-errors rust rust-cargo

3
推荐指数
1
解决办法
516
查看次数

如何在成功时将迭代器转换为流或在失败时将空流转换为空流?

我想采用常规迭代器并将其转换为流,以便我可以进行进一步的流处理.麻烦的是我可能有一个迭代器或错误来处理.我觉得我很接近这个:

#[macro_use]
extern crate log;
extern crate futures; // 0.1.21
extern crate tokio;

use futures::prelude::*;
use futures::{future, stream};
use std::fmt::Debug;
use std::net::{SocketAddr, ToSocketAddrs};

fn resolve(addrs: impl ToSocketAddrs + Debug) -> impl Stream<Item = SocketAddr, Error = ()> {
    match addrs.to_socket_addrs() {
        Ok(iter) => stream::unfold(iter, |iter| match iter.next() {
            Some(a) => Some(future::ok((a, iter))),
            None => None,
        }),
        Err(e) => {
            error!("could not resolve socket addresses {:?}: {:?}", addrs, e);
            stream::empty()
        }
    }
}

fn main() {
    let task = …
Run Code Online (Sandbox Code Playgroud)

asynchronous future rust

2
推荐指数
1
解决办法
476
查看次数

测试 future 和streams,如何创建一个假Context?

我正在尝试弄清楚如何对我的 Stream 进行单元测试fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {todo!()}

它需要一个cx传递给嵌套流的上下文。我的测试和测试代码可以不需要,但我必须提供一些才能进行测试。

铁锈游乐场

use futures::ready;
use futures::stream::Stream;
use pin_project::pin_project;
use std::collections::VecDeque;
use std::pin::Pin;
use std::task::{Context, Poll}; // 0.4.22

#[pin_project]
pub struct MyStream<T>(#[pin] T);

impl<T: Stream> Stream for MyStream<T> {
    type Item = ();
    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
        let _ignored = ready!(self.project().0.poll_next(cx));
        Poll::Ready(Some(()))
    }
}

#[test]
fn test1() {
    let setup = TestStream::from(vec![Poll::Ready(Some(true))]);
    let sut = MyStream(setup);

    // where do …
Run Code Online (Sandbox Code Playgroud)

unit-testing future rust async-await

2
推荐指数
1
解决办法
1002
查看次数