apps/nsq_to_file: supported rotate by size & interval, added <PID> format tag 


apps/nsq_to_file: supported rotate by size & interval
    
    ADD:
    --rotate-size=0,        rotate the file when it grow bigger than `rotate-size` bytes
    --rotate-interval=0,    rotate the file every `rotate-interval` seconds
    --max-revision=1000,    the max <REV> number
    
    CHANGE:
    1. rename <GZIPREV> to <REV> in filename format
    2. reduce `Ticker` duration from 30s to 10s.
    3. rotation only triggered by `Ticker`
    4. `Sync` before `Close`
    
    REMOVE:
    --skip-empty-files,     deprecated, no longer used.

apps/nsq_to_file: add <PID> filename format tag

interesting.
the `Flush` will NOT append 'EOF' to the gzip file.
```go
package main

import "compress/gzip"
import "os"

func main() {
    f, _ := os.OpenFile("xiaost.log.gz", os.O_WRONLY | os.O_CREATE, 0666)
    w, _ := gzip.NewWriterLevel(f, gzip.DefaultCompression)
    w.Write([]byte("xiaost\n"))
    w.Flush()
    f.Sync()
    f.Close()
}
```
```shell
$ gzcat xiaost.log.gz
gzcat: xiaost.log.gz: unexpected end of file
gzcat: xiaost.log.gz: uncompress failed
```
but `Close` do.

what's more, I found that we use `os.O_EXCL` to avoid appending data to gzip file.
I don't know why. 
It works:
```shell
$ echo xiaost | gzip > test.gz
$ echo xiao | gzip >> test.gz
$ gzcat test
xiaost
xiao
```