Re: Basic question about stderr

2016-05-21 Thread Mike Parker via Digitalmars-d-learn

On Saturday, 21 May 2016 at 22:11:30 UTC, chaseratx wrote:

On Saturday, 21 May 2016 at 22:08:15 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:54:43 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:47:20 UTC, chaseratx wrote:
Thanks Era, but I am not trying to fix the range error.  
That was put there intentionally to create stderr output.


 I wonder, this sounds like a TLS (Thread Local Storage) 
issue where the local thread's stderr was updated but the 
global (shared?) one wasn't.


 Well found a quick solution. gotta close the original handle 
first! :)


  stderr.close();
  stderr.open("error.log", "a");
  stdout.open("output.log", "a");


Oh, excellent!  I will try that now. :)


This should also work:

stderr = File("error.log", "a");
stdout = File("output.log", "a");



Re: Basic question about stderr

2016-05-21 Thread chaseratx via Digitalmars-d-learn

On Saturday, 21 May 2016 at 22:08:15 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:54:43 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:47:20 UTC, chaseratx wrote:
Thanks Era, but I am not trying to fix the range error.  That 
was put there intentionally to create stderr output.


 I wonder, this sounds like a TLS (Thread Local Storage) issue 
where the local thread's stderr was updated but the global 
(shared?) one wasn't.


 Well found a quick solution. gotta close the original handle 
first! :)


  stderr.close();
  stderr.open("error.log", "a");
  stdout.open("output.log", "a");


Oh, excellent!  I will try that now. :)


Re: Basic question about stderr

2016-05-21 Thread chaseratx via Digitalmars-d-learn

On Saturday, 21 May 2016 at 21:54:43 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:47:20 UTC, chaseratx wrote:
Thanks Era, but I am not trying to fix the range error.  That 
was put there intentionally to create stderr output.  I'm 
trying to figure out how to get ALL stderr output directed to 
a file the same as if I had used a "2>error.log" redirect from 
the command line.


 Ahh, I didn't realize you were intentionally trying to use the 
exception for the error output.


 I wonder, this sounds like a TLS (Thread Local Storage) issue 
where the local thread's stderr was updated but the global 
(shared?) one wasn't.


https://dlang.org/phobos/std_stdio.html#.stderr

The stderr is defined as "File stderr", not shared. I'm 
convinced TLS is the likely culprit. Unless you can affect the 
original instantiation it probably isn't going to work. I just 
tried using a static this() and it has a similar effect but 
doesn't affect stderr. :(


Ok, thanks for looking into it.  It does seem like it should work 
(to me) since there is no apparent difference between stdout and 
stderr in the docs, and using open() works for stdout.  Not 
something I could intuit.


Appreciate the help.


Re: Basic question about stderr

2016-05-21 Thread Era Scarecrow via Digitalmars-d-learn

On Saturday, 21 May 2016 at 21:54:43 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:47:20 UTC, chaseratx wrote:
Thanks Era, but I am not trying to fix the range error.  That 
was put there intentionally to create stderr output.


 I wonder, this sounds like a TLS (Thread Local Storage) issue 
where the local thread's stderr was updated but the global 
(shared?) one wasn't.


 Well found a quick solution. gotta close the original handle 
first! :)


  stderr.close();
  stderr.open("error.log", "a");
  stdout.open("output.log", "a");



Re: Basic question about stderr

2016-05-21 Thread Era Scarecrow via Digitalmars-d-learn

On Saturday, 21 May 2016 at 21:47:20 UTC, chaseratx wrote:
Thanks Era, but I am not trying to fix the range error.  That 
was put there intentionally to create stderr output.  I'm 
trying to figure out how to get ALL stderr output directed to a 
file the same as if I had used a "2>error.log" redirect from 
the command line.


 Ahh, I didn't realize you were intentionally trying to use the 
exception for the error output.


 I wonder, this sounds like a TLS (Thread Local Storage) issue 
where the local thread's stderr was updated but the global 
(shared?) one wasn't.


https://dlang.org/phobos/std_stdio.html#.stderr

The stderr is defined as "File stderr", not shared. I'm convinced 
TLS is the likely culprit. Unless you can affect the original 
instantiation it probably isn't going to work. I just tried using 
a static this() and it has a similar effect but doesn't affect 
stderr. :(


Re: Basic question about stderr

2016-05-21 Thread chaseratx via Digitalmars-d-learn

On Saturday, 21 May 2016 at 21:40:36 UTC, Era Scarecrow wrote:

On Saturday, 21 May 2016 at 21:21:31 UTC, chaseratx wrote:

I'm learning D and I have a basic question.

I'm trying to write stderr to a file using open() (rather than 
shell piping/redirection).  It works for stdout but doesn't 
seem to work with stderr.


http://pastebin.com/KgzR9wAF

stdout is written to the file, but stderr is not and outputs 
to the shell.  I'm not sure why.  I Googled but couldn't find 
an answer.  Any hints?


  // <= causes range violation, might use foreach instead
  while (i < numbers.length) {
write(numbers[i], " ");
stderr.write(numbers[i]*10); //force stderr, 10x to 
differentiate output


with (stderr) {  //also force stderr
  write(" ");
}


Thanks Era, but I am not trying to fix the range error.  That was 
put there intentionally to create stderr output.  I'm trying to 
figure out how to get ALL stderr output directed to a file the 
same as if I had used a "2>error.log" redirect from the command 
line.


Re: Basic question about stderr

2016-05-21 Thread Era Scarecrow via Digitalmars-d-learn

On Saturday, 21 May 2016 at 21:21:31 UTC, chaseratx wrote:

I'm learning D and I have a basic question.

I'm trying to write stderr to a file using open() (rather than 
shell piping/redirection).  It works for stdout but doesn't 
seem to work with stderr.


http://pastebin.com/KgzR9wAF

stdout is written to the file, but stderr is not and outputs to 
the shell.  I'm not sure why.  I Googled but couldn't find an 
answer.  Any hints?


  // <= causes range violation, might use foreach instead
  while (i < numbers.length) {
write(numbers[i], " ");
stderr.write(numbers[i]*10); //force stderr, 10x to 
differentiate output


with (stderr) {  //also force stderr
  write(" ");
}