我正在使用github.com/sirupsen/logrus来登录我的 golang 脚本,但是我想获取记录消息的文件名和行号。我可以使用下面的代码得到它:
package main
import (
"fmt"
"os"
"runtime"
"strings"
"github.com/sirupsen/logrus"
)
func GetLogger() (*logrus.Logger, *os.File) {
log := logrus.New()
log.SetReportCaller(true)
file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
log.Out = file
log.Formatter = &logrus.TextFormatter{
CallerPrettyfier: func(f *runtime.Frame) (string, string) {
repopath := fmt.Sprintf("%s/src/github.com/bob", os.Getenv("GOPATH"))
filename := strings.Replace(f.File, repopath, "", -1)
return fmt.Sprintf("%s()", f.Function), fmt.Sprintf("%s:%d", filename, f.Line)
},
}
return log, file
}
Run Code Online (Sandbox Code Playgroud)
然而,这给出了以下格式的日志:
time="2020-04-02T11:43:19+05:30" level=info msg=Hello func="main.main()" file="D:/.../main.go:13"
但我想要的登录格式如下:
Apr 02 …
模型中的电子邮件字段可以用作其余 api 的查找字段吗?
我有一个模型“用户”,其中 username=models.CharField() 和 email=models.EmailField() 作为成员。我想将电子邮件设置为视图集中的查找字段,并具有以下相同的代码。
def get_queryset(self):
if 'email' in self.kwargs:
return User.objects.filter(email=self.kwargs['email'])
else:
return User.objects.all()
lookup_field = 'email'
lookup_url_kwarg = 'email'
Run Code Online (Sandbox Code Playgroud)
但是,由于电子邮件字段始终包含一个“.”,查找失败并显示“当前路径与这些中的任何一个都不匹配”消息。我们如何使用包含 '.' 的值执行成功的 api 查找。例如电子邮件
获取/api/user/abc@def.com
模型:
class Genre(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Song(models.Model):
name = models.CharField(max_length=200)
genre = models.ManyToManyField(Genre)
Run Code Online (Sandbox Code Playgroud)
序列化器:
class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = '__all__'
class SongSerializer(serializers.ModelSerializer):
class Meta:
model = Song
fields = '__all__'
def to_representation(self, instance):
rep = super().to_representation(instance)
print(GenreSerializer(instance.name).data)
return rep
Run Code Online (Sandbox Code Playgroud)
序列化程序中的上述打印给出: {'name': None} 并且响应使用流派 ID 而不是值:
[
{
"id": 1,
"name": "Abcd",
"genre": [
1,
3
]
}
]
Run Code Online (Sandbox Code Playgroud)
其中流派1. 流行,3. 摇滚
我可以对 to_representation 进行哪些更改以打印值而不是流派的 id,流派是具有歌曲模型的 ManyToManyField。
模型:
class Person(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
def __str__(self):
return self.first_name + ' ' + self.last_name
class Gender(models.Model):
gender = models.CharField(max_length=1)
def __str__(self):
return self.gender
class Details(models.Model):
name = models.ForeignKey(Person, on_delete=models.CASCADE)
dob = models.DateField()
gender = models.ForeignKey(Gender, on_delete=models.DO_NOTHING)
Run Code Online (Sandbox Code Playgroud)
序列化器:
class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = '__all__'
class GenderSerializer(serializers.ModelSerializer):
class Meta:
model = Gender
fields = '__all__'
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ['name', 'dob', 'gender']
Run Code Online (Sandbox Code Playgroud)
目前,我得到的输出低于上面的输出:
[
{
"name": 1,
"dob": "1990-05-19", …Run Code Online (Sandbox Code Playgroud) 我读了一篇类似的帖子,标题为"只有当下一行与模式不匹配时才打印匹配模式的行",所提到的解决方案是
awk 'a=/^O/{x=$0} !a&&x{print x;x=0;}' myfile
Run Code Online (Sandbox Code Playgroud)
我只是想知道如果我想打印下一行也以与当前行相同的模式开始的文件中的所有行,上述命令将如何改变.
例如
文件文本包含:
abc this is a line
def
abc this is line 2
ghi
abc this is line 3
abc this is line 4
jkl
mno
abc this is line 5
jkl
abc this is line 6
abc this is line 9
jkl
Run Code Online (Sandbox Code Playgroud)
该命令应该只打印以下行:
abc this is line 3
abc this is line 6
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
感谢所有帮助过的人.在这里编辑原始问题以满足要求,因为当存在多个相似的行时,以下将无济于事.
如果要打印文件中的所有行以使下一行以不同的模式结束,那么awk命令会是什么?
例如:如果文件包含:
Student name is A
Student name is B
Student name is C
result …Run Code Online (Sandbox Code Playgroud)