13. januar 2003 - 20:02Der 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.
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å ?
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>
å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 !
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.
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.
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...
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.
Synes godt om
Ny brugerNybegynder
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.