Avatar billede stringbuffer Nybegynder
13. januar 2003 - 20:02 Der er 7 kommentarer og
3 løsninger

ny logfil hver time

Jeg vil gerne have mit serverprogram til at skrive til logfiler, men det skal være sådan at hver fil bliver startet når en ny time er rundet.

Samtidig vil jeg gerne lave det så filnavnene på logfilerne svarer til det tidspunkt, de blev åbnet, altså f.eks. log13-01-2002_20 hvis dato er den 13/1 2002 og klokken er 20:00.

Kodeeksempel ønskes. Det skal virke i Linux.
Avatar billede kondi.koder Nybegynder
13. januar 2003 - 20:17 #1
Er det forstået rigtigt hvis jeg siger at:

Du vil gerne have noget som kører dine programmer/commandoer hver time, og de log filer, som de programmer/commandoer producere, skal have navn relateret til det tidspunkt det blev lavet på ?

- kondi.koder :-)
Avatar billede soreno Praktikant
13. januar 2003 - 20:19 #2
Du finder current time sådan:
    struct tm *clock;
    time_t now;
    time(&now);
    clock = localtime(&now);

så kan du hive relevante oplysninger ud af clock, f.eks.
printf("timen er nu: %i\n", clock->tm_hour);

så kan du selv sammensætte filnavnet med sprintf, f.eks.
char filnavn[256];
sprintf(filnavn, "log%02i-%02i-%i_%i", clock->tm_mday, (clock->tm_mon+1), (clock->tm_year+1900), clock->tm_hour);
printf("filnavnet er: %s\n", filnavn);



Et kørende eksempel:
#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    struct tm *clock;
    time_t now;
    time(&now);
    clock = localtime(&now);
    printf("%02i/%02i-%i\n", clock->tm_mday, clock->tm_mon+1, clock->tm_year+1900);

    return 0;
}
Avatar billede arne_v Ekspert
13. januar 2003 - 21:12 #3
Det du vil have er noget kode som:

åbner en fil ved opstart
har en timer der kører hver time der lukke rfilen og åbner en ny fil
filerne har navne efter tidspunktet
din kode skriver så bare til fil-pointeren når der skal logges

Dette er en meget gængs funktionalitet.

Det svære er at få lavet en timer der kører hver
time.

Men der må være en funktion i Linux til at gøre det !

[men jeg kender den ikke]
Avatar billede stringbuffer Nybegynder
13. januar 2003 - 22:22 #4
arne_v <- det er netop denne timer... for det med at se hvad klokken er, er jo trivielt... men hvad f... skal man gøre for at lave en præcis timer, der netop falder sammen med timeskift?

En idé, jeg lige fik, er at lave en grov timer, f.eks. sleep i f.eks. 50 minutter, derefter bruge en bisektions-algoritme til at tjekke hvor meget tid der er tilbage til timeskift, så hvis der er 10 min. tilbage så laver den sleep i 5 minutter, 2,5 minut osv. intil den når 1 sekund.
Avatar billede stringbuffer Nybegynder
13. januar 2003 - 22:59 #5
Min idé virker faktisk, og dens anvendelighed kan begrundes med følgende:
Det er ikke afgørende om filen påbegyndes præcist samme sekund som klokken skifter, MEN: der må ikke være flere eller færre logfiler på et år, end der er timer.
Avatar billede jpk Nybegynder
14. januar 2003 - 08:40 #6
Hvorfor alle de sleeps?
Hvad med bare at kalde sleep med den tid indtil næste time runder..?
Avatar billede stringbuffer Nybegynder
14. januar 2003 - 12:00 #7
fordi sleep er upræcis
Avatar billede jpk Nybegynder
14. januar 2003 - 12:14 #8
Jo, men så meget..?

Bliver den mere præcis af at blive kaldt flere gange..?
Jeg forstår godt hvor du vil hen, men prøv at lave et par forsøg med nøjagtigheden og se hvad du får...

Du kan evt. sleep'e indtil et par sekunder før hver hele time, for så at kalde sleep(0) indtil du er tilfreds med nøjagtigheden.
sleep(0) afgiver jo ikke sin time slice på CPU'en med mindre der er højere prioriterede processer der skal til, som det er tilfældet, hvis du angiver en værdi forskellig fra 0.
Endelig kan du jo gå over til at lave busy wait når du er "meget" tæt på den "rigtige" værdi...

Men hvad er egentlig præcisionen på maskinens ur?
Er det indstillet præcist?
Hvor lang tid tager det at hente de informationer der skal logges?
osv...
Avatar billede stringbuffer Nybegynder
14. januar 2003 - 12:18 #9
jpk <- jeg har MEGET blandede erfaringer med sleep. Nogle gange har den sovet over sig.
Avatar billede stringbuffer Nybegynder
14. januar 2003 - 12:20 #10
Jeg har implementeret min metode, og den lader til at virke ret godt.

Jeg bruger ftell() og rename() til at gerbruge en eksisterende logfil hvis den er tom, så der kun bliver gemt filer hvis der er skrevet noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester