我正在考虑和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".log"" />
<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之间是一致的.这仍然没有解决问题,但至少我现在可以理解奇怪的修改时间模式.
谢谢,罗布
我正在尝试将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) 我正在尝试找出使用log4net将所有日志编写为JSON的sigle行的最佳方法.我希望能够配置任何appender来使用它.任何帮助,将不胜感激.
我遇到了这个有趣的行为.我看到左连接是要走的路,但仍然希望将其清除.是设计中的错误还是行为?有什么解释吗?
当我从左表中选择记录时,右表上子查询的结果中不存在值,如果子查询结果为空,则不返回预期的"缺失"记录.我期望将此查询编写为等效的两种方法.
谢谢!
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) 我有一个非常赏心悦目的东西,但我担心它的含义:
#[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)
我的学习项目供参考
$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上.
谢谢,罗布
我正在尝试使用 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 套接字可能很愚蠢?
仍在努力应对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) 当我使用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)
我探索了 synPartialEq和Eq …
我想采用常规迭代器并将其转换为流,以便我可以进行进一步的流处理.麻烦的是我可能有一个迭代器或错误来处理.我觉得我很接近这个:
#[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) 我正在尝试弄清楚如何对我的 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) rust ×5
future ×2
log4net ×2
async-await ×1
asynchronous ×1
buffer ×1
c# ×1
dependencies ×1
enums ×1
flush ×1
in-subquery ×1
io ×1
json ×1
left-join ×1
lifetime ×1
logging ×1
mono ×1
networking ×1
null ×1
powershell ×1
reference ×1
rust-cargo ×1
sockets ×1
sql ×1
sql-server ×1
string ×1
timeout ×1
unc ×1
unit-testing ×1
unix ×1
variables ×1
windows ×1
xml ×1